软件体系结构-简单工厂模式

定义

创建型模式

在简单工厂模式中用于创建实例的方法通常是静态(static)方法,因此又被称为静态工厂方法(Static Factory Method)模式

要点:如果需要什么,只需要传入一个正确的参数,就可以获取所需要的对象,而无须知道其创建细节

UML类图

组成:工厂类,抽象产品类,具体产品类,客户端类

考试时的分析注意分析对应关系:

代码

抽象产品类

1
2
3
public abstract class Shape {
public abstract void Draw();
}

具体产品类

1
2
3
4
5
6
public class Circle extends Shape{
@Override
public void Draw() {
System.out.println("This is a circle");
}
}

工厂类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class shapeFactory {
public static Shape createShape(char t){
switch (t){
case 'c':
return new Circle();
case 'r':
return new Rectangel();
case 'e':
return new Ellipse();
default:
System.out.println("attr error!");
return new Circle();
}
}
}

客户端类

1
2
3
4
5
6
7
8
9
10
public class shapeMain {
public static void main(String[] args) {
Circle circle = (Circle)shapeFactory.createShape('c');
Rectangel rectangel = (Rectangel)shapeFactory.createShape('r');
Ellipse ellipse = (Ellipse) shapeFactory.createShape('e');
circle.Draw();
rectangel.Draw();
ellipse.Draw();
}
}

优化

一般可以通过引入配置文件来优化简单工厂模式

优点

  • 实现了对象创建和使用的分离
  • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可(最少知识原则)
  • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性(但是增加产品类要修改工厂的代码)

缺点

  • 工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响
  • 增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度
  • 系统扩展困难,一旦添加新产品不得不修改工厂逻辑
  • 由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构,工厂类不能得到很好地扩展

适用环境

  • 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂
  • 客户端只知道传入工厂类的参数,对于如何创建对象并不关心