工厂方法模式模式小结:
工厂方法模式是简单工厂模式的延伸,它继承了简单工厂模式的优点,同时还弥补了简单工厂模式的不足。
优点:
- 1.工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
- 2.基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够让工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。
- 3.在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。符合开闭原则
缺点: - 1.在增加新产品的时候需要同时增加工厂类和产品类,会增加系统的类个数,一定程度上增加系统复杂度。
- 2.要考虑系统的扩展性,所以会引入抽象层和,调用均通过抽象层调用,会增加系统的抽象性和理解难度。
- 3.由于为了符合开闭原则,可能会引入DOM,反射,等技术,会增加实现难度。
适用场景
- 1.客户端不需要知道调用的对象类,只需要知道对象所对应的工厂。
- 2.抽象工厂对象通过其子类来指定生产的对象,抽象工厂对象只需提供一个创建产品的接口或抽象方法,具体实现由其子类来确定。
示例场景
有一款图片读取解析软件,读取各种不同类型的图片格式并解析,针对每一种图片格式都设计一个图片读取器,如GIF图片读取器用于读取GIF格式的图片、JPG图片读取器用于读取JPG格式的图片。
UML类图
示例代码
//图片接口
public interface Picture {
//图片的解析方法,解析png,jpg,gif等图片
void analysis();
}
//具体图像对象
public class JPGPicture implements Picture {
@Override
public void analysis() {
System.out.println("解析JPG图片");
}
}
//抽象的图片工厂方法
public abstract class PictureFactory {
//读取图片方法
public abstract Picture readPicture();
public void analysisPicture(){
Picture picture = this.readPicture();
picture.analysis();
}
}
//具体的图片工厂
public class JPGFactory extends PictureFactory{
@Override
public Picture readPicture() {
System.out.println("读取jpg图片");
return new JPGPicture();
}
}
//客户端调用,使用读取XML配置,反射获取实现类的方式
PictureFactory pictureFactory = (PictureFactory) XMLUtil.getBean();
pictureFactory.analysisPicture();
网友评论