Java设计模式-工厂模式
工厂模式主要分为三种:简单工厂模式、工厂方法模式、抽象工厂模式。
工厂模式的应用场景包括但不限于:
- 当需要创建的对象类型较多且创建逻辑复杂时。
- 当需要动态决定创建哪种对象时。
- 当需要集中管理对象的创建时。
- 当需要提高代码的灵活性和可扩展性时
工厂模式的优点:
- 封装对象创建过程:工厂模式将对象的创建过程封装在一个单独的类中,客户端无需关心具体的创建细节,只需通过工厂类来获取所需的对象。这样可以隐藏对象创建的细节,降低客户端与具体类之间的耦合度。
- 简化客户端代码:客户端无需知道如何创建对象,只需调用工厂提供的方法即可获取所需对象,这使得客户端代码更加简洁和易于维护。
- 集中控制对象创建:通过工厂模式,可以将对象的创建集中管理,便于统一管理和维护。例如,可以在工厂类中添加缓存、对象池等机制来优化对象的创建和销毁。
- 解耦客户端和具体类:工厂模式可以将客户端代码与具体类解耦,客户端只依赖于工厂接口或抽象类,而不依赖于具体的类实现。这样可以方便替换具体的类实现,提高了代码的灵活性和可扩展性。
- 支持更复杂的对象创建:在工厂模式中,可以根据不同的条件或参数来创建不同的对象,从而实现更复杂的对象创建逻辑。
- 扩展性高:如果想增加一个产品,只需扩展一个工厂类即可,而不需要修改现有的客户端代码。
- 屏蔽产品具体实现:调用者只关心产品的接口,而不必了解具体的实现细节。
(一)简单工厂模式java样例:
以下是一个简单的 Java 工厂模式的代码样例,包含了简单的产品抽象类、具体产品类以及工厂类,演示了工厂模式的基本结构和使用方式。
1. 产品抽象类(Product)
首先定义一个抽象类 Product,它是所有具体产品类的父类,定义了产品共有的行为方法(这里以一个简单的 show 方法为例)。
// 抽象产品类
public abstract class Product {
public abstract void show();
}
2. 具体产品类(ConcreteProduct)
创建两个具体的产品类 ConcreteProductA 和 ConcreteProductB,它们都继承自抽象产品类 Product,并实现了 show 方法,用来展示不同产品的具体信息。
// 具体产品类A
public class ConcreteProductA extends Product {
@Override
public void show() {
System.out.println("这是具体产品A");
}
}
// 具体产品类B
public class ConcreteProductB extends Product {
@Override
public void show() {
System.out.println("这是具体产品B");
}
}
3. 工厂类(Factory)
接着创建工厂类 Factory,它负责根据传入的参数来创建不同类型的具体产品对象。
// 工厂类
public class Factory {
public static Product createProduct(String type) {
if ("A".equals(type)) {
return new ConcreteProductA();
} else if ("B".equals(type)) {
return new ConcreteProductB();
}
return null;
}
}
4. 测试使用
最后编写一个测试类来使用工厂模式创建产品对象并调用相应的方法。
// 测试类
public class Main {
public static void main(String[] args) {
Product productA = Factory.createProduct("A");
Product productB = Factory.createProduct("B");
if (productA!= null) {
productA.show();
}
if (productB!= null) {
productB.show();
}
}
}
在上述代码中:
- 通过工厂类 Factory 可以根据不同的条件(这里是传入的字符串类型标识)来创建不同的具体产品对象,将对象的创建和使用逻辑进行了解耦。
- 当需要新增产品类型时,只需要创建新的具体产品类并在工厂类中添加相应的创建逻辑分支即可,符合开闭原则,提高了代码的可维护性和扩展性。
请注意,这只是一个简单的工厂模式示例,实际应用中可能会根据具体需求进行更复杂的设计和扩展,比如使用反射机制来更灵活地创建对象等。
(二)工厂方法模式java样例:
1. 产品抽象类(Shape)
首先定义一个抽象的产品类,这里以图形 Shape 为例,它定义了所有图形都需要实现的一个抽象方法 draw,用于绘制图形。
// 抽象图形类,代表产品抽象类
public abstract class Shape {
public abstract void draw();
}
2. 具体产品类(Circle、Rectangle)
创建两个具体的产品类,分别代表圆形 Circle 和矩形 Rectangle,它们都继承自抽象的 Shape 类,并实现了 draw 方法来定义各自具体的绘制逻辑。
// 具体产品类 - 圆形
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("正在绘制圆形");
}
}
// 具体产品类 - 矩形
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("正在绘制矩形");
}
}
3. 抽象工厂类(ShapeFactory)
接着定义抽象工厂类 ShapeFactory,它里面包含了一个抽象的工厂方法 createShape,这个方法用于创建具体的图形对象,具体由其子类去实现如何创建具体的图形。
// 抽象工厂类
public abstract class ShapeFactory {
public abstract Shape createShape();
}
4. 具体工厂类(CircleFactory、RectangleFactory)
创建两个具体的工厂类,分别对应创建圆形和矩形的工厂,它们继承自抽象的 ShapeFactory 类,并实现了 createShape 方法来返回对应的具体图形对象。
// 具体工厂类 - 圆形工厂
public class CircleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
// 具体工厂类 - 矩形工厂
public class RectangleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
}
5. 测试使用
最后编写一个测试类来使用这些工厂类创建具体的图形对象并调用其绘制方法。
// 测试类
public class Main {
public static void main(String[] args) {
// 使用圆形工厂创建圆形对象并绘制
ShapeFactory circleFactory = new CircleFactory();
Shape circle = circleFactory.createShape();
circle.draw();
// 使用矩形工厂创建矩形对象并绘制
ShapeFactory rectangleFactory = new RectangleFactory();
Shape rectangle = rectangleFactory.createShape();
rectangle.draw();
}
}
在上述代码中:
- 通过工厂方法模式,将具体图形对象的创建逻辑封装到了对应的具体工厂类中,实现了创建和使用的分离,使得代码结构更加清晰,易于维护和扩展。例如,如果后续要添加新的图形类型,只需要创建新的具体图形类和对应的具体工厂类即可,不会影响到已经存在的代码逻辑。
(三)抽象工厂模式java样例:
以下是一个使用 Java 语言实现抽象工厂模式的代码样例,抽象工厂模式是一种创建对象的设计模式,它提供了一种创建一系列相关对象的接口,而无需指定它们具体的类。这里以创建不同主题风格(比如简约风格、华丽风格)的按钮和文本框组件为例来进行演示:
1. 抽象产品类
首先定义抽象的产品类,分别是按钮(Button)和文本框(TextBox)的抽象类,它们各自定义了展示(display)功能的抽象方法,代表不同主题风格下该组件的展示行为。
// 抽象按钮类
public abstract class Button {
public abstract void display();
}
// 抽象文本框类
public abstract class TextBox {
public abstract void display();
}
2. 具体产品类
创建不同主题风格下的具体产品类,例如简约风格的按钮(SimpleButton)、华丽风格的按钮(FancyButton)以及简约风格的文本框(SimpleTextBox)、华丽风格的文本框(FancyTextBox),它们都分别继承自对应的抽象产品类,并实现了 display 方法来展示各自的外观特点。
// 简约风格按钮类
public class SimpleButton extends Button {
@Override
public void display() {
System.out.println("这是简约风格的按钮");
}
}
// 华丽风格按钮类
public class FancyButton extends Button {
@Override
public void display() {
System.out.println("这是华丽风格的按钮");
}
}
// 简约风格文本框类
public class SimpleTextBox extends TextBox {
@Override
public void display() {
System.out.println("这是简约风格的文本框");
}
}
// 华丽风格文本框类
public class FancyTextBox extends TextBox {
@Override
public void display() {
System.out.println("这是华丽风格的文本框");
}
}
3. 抽象工厂类
接着定义抽象工厂类 GUIFactory,它包含了抽象的创建按钮(createButton)和创建文本框(createTextBox)的方法,用于创建不同主题风格下对应的组件对象,具体由其子类去实现具体的创建逻辑。
// 抽象图形用户界面工厂类
public abstract class GUIFactory {
public abstract Button createButton();
public abstract TextBox createTextBox();
}
4. 具体工厂类
创建两个具体的工厂类,分别对应简约风格(SimpleGUIFactory)和华丽风格(FancyGUIFactory)的工厂,它们继承自抽象的 GUIFactory 类,并实现了 createButton 和 createTextBox 方法来返回相应风格的按钮和文本框对象。
// 简约风格工厂类
public class SimpleGUIFactory extends GUIFactory {
@Override
public Button createButton() {
return new SimpleButton();
}
@Override
public TextBox createTextBox() {
return new SimpleTextBox();
}
}
// 华丽风格工厂类
public class FancyGUIFactory extends GUIFactory {
@Override
public Button createButton() {
return new FancyButton();
}
@Override
public TextBox createTextBox() {
return new FancyTextBox();
}
}
5. 测试使用
最后编写测试类来使用具体的工厂类创建不同主题风格下的组件,并调用它们的展示方法。
// 测试类
public class Main {
public static void main(String[] args) {
// 使用简约风格工厂创建组件并展示
GUIFactory simpleFactory = new SimpleGUIFactory();
Button simpleButton = simpleFactory.createButton();
TextBox simpleTextBox = simpleFactory.createTextBox();
simpleButton.display();
simpleTextBox.display();
// 使用华丽风格工厂创建组件并展示
GUIFactory fancyFactory = new FancyGUIFactory();
Button fancyButton = fancyFactory.createButton();
TextBox fancyTextBox = fancyFactory.createTextBox();
fancyButton.display();
fancyTextBox.display();
}
}
在上述代码中:
- 通过抽象工厂模式,可以方便地切换不同的主题风格,只需要使用对应的具体工厂类即可创建出一系列相关风格的组件对象,实现了代码的高内聚、低耦合,提高了软件系统的可维护性和可扩展性。例如,当要新增一种主题风格时,只需创建新的具体产品类和对应的具体工厂类,原有代码基本不需要改动。