工厂方法模式
概述
与简单工厂的区别
工厂方法模式也是工厂模式的一种,对比简单工厂模式,他们之间的区别有以下几点:
- 简单工厂模式是根据参数的不同用 if 与 else 判断返回的产品,其工厂职责很重,可能一个工厂类中有高达几个个 if 。而工厂方法模式将工厂分离,具体实现工厂继承同一个抽象工厂,具体实现工厂生产不同的产品。
- 简单工厂模式如果要加入新的产品,那么必须修改工厂的逻辑,违背了“开闭原则”。而工厂方法模式则可以新建工厂或者产品,不用修改代码逻辑。
定义与使用场景
工厂方法模式:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。
主要解决:接口选择问题。
适用场景:
- 客户端不知道其需要的对象的类。
- 抽象工厂类通过其子类指定创建哪个对象。
- 通俗来说,就是明确计划不同条件创建不同实例。
工厂方法模式结构
- Factory(抽象工厂类):声明了工厂方法,用于返回一个产品,所有创建对象的工厂类都需要实现该接口。
- ConcreteFactory(具体工厂类):抽象工厂类的子类,实现了抽象工厂类中的返回具体产品类的方法。
- Product(抽象产品类):定义产品的接口,用于传参与抽象。
- ConcreteProduct(具体产品):具体产品类,具体工厂与具体产品一一对应。
实例
结构
/**
抽象工厂类
**/
public abstract class ImageReaderFactory {
public abstract Image readImage();
}
/**
一个JPG读取工厂实现类
**/
public class GIFImageReaderFatory extends ImageReaderFactory{
@Override
public GIFImage readImage() {
return new GIFImage();
}
}
/**
一个GIF读取工厂实现类
**/
public class JPGImageReaderFactory extends ImageReaderFactory{
@Override
public Image readImage() {
return new JPGImage();
}
}
/**
抽象产品类
**/
public abstract class Image {
public String getImageData() {
return imageData;
}
public void setImageData(String imageData) {
this.imageData = imageData;
}
public String imageData;
}
/**
一个具体产品类
**/
public class GIFImage extends Image{
GIFImage(){
this.imageData="gif";
}
}
/**
一个具体产品类
**/
public class JPGImage extends Image{
JPGImage(){
this.imageData="jpg";
}
}
/**
测试类
**/
public class Test {
public static void main(String[] args) {
ImageReaderFactory factory;
Image image;
factory=new GIFImageReaderFatory();
System.out.println(factory.readImage().getImageData());
}
}
结果:
具体使用场景
- 日志记录器
- 数据库访问:用户不知道系统采用哪一类数据库,以及数据库有可能变化。
- 设计一个连接服务器的框架,需要三个协议,“POP3”,“IMAP”,“HTTP”,使用一个共同的接口,三个作为具体产品类。