一、工厂方法模式
抽象产品:描述具体产品的公共接口。
具体产品:象产品的子类,工厂类要创建的目标类,描述生产的具体产品。
抽象工厂:描述具体工厂的公共接口。
具体工厂:抽象工厂的子类;被外界调用,实现 FactoryMethod 工厂方法创建产品的实例。
创建过程:
①:创建抽象工厂类,定义具体工厂的公共接口;
②:创建抽象产品类 ,定义具体产品的公共接口;
③:创建具体产品类(继承抽象产品类)与定义生产的具体产品;
④:创建具体工厂类(继承抽象工厂类)与定义创建对应具体产品实例的方法;
⑤:外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例。
- 工厂方法模式的优点:
- 更符合开-闭原则,新增一种产品时,只需要增加相应的具体产品类
和相应的工厂子类即可; - 符合单一职责原则,每个具体工厂类只负责创建对应的产品,不使用静态工厂方法,可以形成基于继承的等级结构;
- 更符合开-闭原则,新增一种产品时,只需要增加相应的具体产品类
- 工厂方法模式的缺点:
- 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂
类,增加系统复杂度。
- 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂
二、工厂方法模式例题
现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器 ImgReader,如 gif 图片读取器 GifReader 用于读取 gif 格式的图片,jpg 图片读取器 JPGReader 用于读取 jpg 格式的图片。图片读取器对象通过图片读取器工厂ImgReaderFactory 来创建。ImgReaderFactory 是一个抽象类,用于定义创建图片读取器的工厂方法,其 GifReaderFactory 和 JPGReaderFactory 用于创建具体的图片读取器对象。使用工厂方法模式,实现该程序的设计。
抽象工厂:ImgReaderFactory 接口,有一个用来生产 ImgReader 产品的方法;
具体工厂:GifReaderFactory 和 JpgReaderFactory 实现了 ImgReaderFactory 接口,并有一个用来生产具体产品的方法;
抽象产品:ImgReader 接口,有一个 read 的方法;
具体产品:GidReader,JpgReader 实现了 ImgReader 接口和 read 方法。
Client:用来测试使用工厂来生产具体产品。
代码实现:
// 抽象工厂接口
public interface ImageReaderFactory {
public ImgReader createReader();
}
// 具体工厂 GifReaderFactory
public class GifReaderFactory implements ImageReaderFactory {
@Override
public ImgReader createReader() {
return new GIfReader();
}
}
// 具体工厂 JpgReaderFactory
public class JpgReaderFactory implements ImageReaderFactory {
@Override
public ImgReader createReader() {
return new JpgReader();
}
}
// 抽象产品接口
public interface ImgReader {
void read();
}
// 具体产品 GIfReader
public class GIfReader implements ImgReader {
@Override
public void read() {
System.out.println("gif");
}
}
// 具体产品 JpgReader
public class JpgReader implements ImgReader {
@Override
public void read() {
System.out.println("jpg");
}
}
// 测试
public class Client {
public static void main(String[] args) {
ImageReaderFactory factory1 = new JpgReaderFactory();
ImgReader reader1 = factory1.createReader();
reader1.read(); // 输出 jpg
ImageReaderFactory factory2 = new GifReaderFactory();
ImgReader reader2 = factory2.createReader();
reader2.read(); // 输出 gif
}
}
标签:02,创建,模式,工厂,具体,产品,ImgReader,public
From: https://www.cnblogs.com/hbjiaxin/p/16907365.html