02-简单工厂模式
简单工厂模式
简单工厂模式又叫静态方法模式。因为在简单工厂模式中创建的实例的方法通常为静态(static)方法。
模式的结构与实现
简单工厂模式的主要角色:
- 简单工厂(SimpleFactory):简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以直接被外部调用,创建所需的产品对象。
- 抽象产品(AbstractProduct):简单工厂创建对象的所有对象的父类,负责描述所有实例共有的公共接口。
- 具体产品(Product):简单工厂模式的创建目标。
UML类图
实例
需求:创建一个可以绘制不同形状的绘图工具,可以绘制圆形,正方形,三角形,每个图形都会有一个draw()方法用于绘图。
分析可知正方形,三角形,圆都有一个共同的draw方法,所以在它们的公共父类(AbstractProduct)里声明一个draw方法。
实现代码步骤如下:
- 创建产品顶层抽象类,定义具体产品的公共接口
AbstractProduct
1
2
3public interface AbstractProduct {
void draw();
} - 创建具体的产品类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33//圆形产品
public class CircleShape implements AbstractProduct {
public CircleShape(){
System.out.println("CircleShape created");
}
public void draw() {
System.out.println("CircleShape 正在绘制圆形图案");
}
}
//正方形产品
public class RectShape implements AbstractProduct {
public RectShape(){
System.out.println("RectShape created");
}
public void draw() {
System.out.println("RectShape 正在正方形图案");
}
}
//三角形产品
public class TriangleShape implements AbstractProduct {
public TriangleShape(){
System.out.println("TriangleShape created");
}
public void draw() {
System.out.println("TriangleShape 正在绘制三角形图案");
}
} - 创建工厂类,通过创建静态方法根据传入的参数创建不通产品实例
1
2
3
4
5
6
7
8
9
10
11
12
13public class SimpleFactory {
public static AbstractProduct getShape(String type) {
AbstractProduct shape = null;
if (type.equalsIgnoreCase("circle")) {
shape = new CircleShape();
} else if (type.equalsIgnoreCase("rect")) {
shape = new RectShape();
} else if (type.equalsIgnoreCase("triangle")) {
shape = new TriangleShape();
}
return shape;
}
} - client根据调用工厂类静态方法,通过不通参数创建不同的产品实例
1
2
3
4
5
6
7
8
9
10
11public class Client {
public static void main(String[] args) {
AbstractProduct circleShape = SimpleFactory.getShape("circle");
circleShape.draw();
circleShape = SimpleFactory.getShape("rect");
circleShape.draw();
circleShape = SimpleFactory.getShape("triangle");
circleShape.draw();
}
} - 结果输出
1 |
|
总结
优点
- 将创建实例的工作与使用实例的工作分开,使用者无需关心对象的创建过程,实现了解耦。
- 把初始化实例的工作放在了工厂里进行,使得代码更容易维护。
缺点
- 工厂类集中了所有实例的创建逻辑,一旦这个工厂不能正常工作,整个系统会受到影响。
- 违背开闭原则,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
- 由于使用了静态工厂方法,静态方法不能被重写和继承,会造成工厂角色无法形成基于继承的等级结构。
应用场景
- 客户端不关心对象的创建过程。
- 工厂类负责创建的对象(具体产品)比较少。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!