软件体系结构-工厂方法模式

定义

简单工厂不符合开闭原则:添加新的产品类需要修改工厂类的代码

工厂方法模式:

  • 不再提供一个工厂类来统一负责所有产品的创建,而是将具体产品的创建过程交给专门的工厂子类去完成
  • 如果出现新的产品类型,只需要为这种新类型的产品定义一个具体的工厂类就可以创建该新产品的实例
  • 目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类
  • 开闭原则 √

UML类图

代码

抽象产品

1
2
3
public abstract class ImageReader {
public abstract void readImage();
}

具体产品

1
2
3
4
5
6
public class GifReader extends ImageReader {
@Override
public void readImage(){
System.out.println("Read a gif");
}
}

抽象工厂

1
2
3
public abstract class ImageReaderFactory {
public abstract ImageReader createImageReader();
}

具体工厂

1
2
3
4
5
6
public class GifReaderFactory extends ImageReaderFactory{
@Override
public ImageReader createImageReader() {
return new GifReader();
}
}

客户端

1
2
3
4
5
6
7
public class client {
public static void main(String[] args) {
ImageReaderFactory factory = new GifReaderFactory();
ImageReader imageReader = factory.createImageReader();
imageReader.readImage();
}
}

优点

  • 工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节
  • 能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部
  • 在系统中加入新产品时,完全符合开闭原则

缺点

  • 系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销
  • 增加了系统的抽象性和理解难度

适用场景

  • 客户端不知道它所需要的对象的类(客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体产品对象由具体工厂类创建)
  • 抽象工厂类通过其子类来指定创建哪个对象