工厂模工是设计模式中最基础模式之一,但想彻底通透的了解它的精髓和三种工厂之间的关系,还是需要下一点工夫,今天我就帮大家一起来彻悟一下。
画了些图来解释一下个人的理解,不正之处敬请赐教。
先用生活中的事例来描述下这三种工厂的基本样子。
第一张,简单工厂。
开发商找到建筑公司,建筑公司直接给开发商建造房子,停车场,花园等,只要开发商有需求,建筑公司又可以做的,都可以提供。
第二张,工厂方法。
这个生产关系就多了一层分包,建筑公司不在直接参与生产,而是只提供建筑图纸。具体施工由子公司来完成,而且是不同的子公司,因为不同的公司擅长的方向不同,所以把不同种类的工程分包给各自擅长的子公司。
第三张,抽象工厂方法。
多家建筑公司竞标,而每一家竞标公司按照建筑公司的图纸都可以建造所有的建筑物和提供维修服务,最终只会有一家公司中标。这个例子有个不合理的地方是,一旦建筑都建成之后,不会那么容易的整体拆掉重建,所以这些建筑公司提供的不仅是建造任务还有维修服务。那么虽然有中标公司承接了工程,可如果后继发现服务出现问题,开发商可以随时启动再竞标程序,替换成另一家公司的服务。
接下来看一下类图:
简单工厂:
某家喜欢某马车,家里的车都是某马系列。
工厂方法:
马系列的车也要国产化了,所以不同的车型可能是不同的工厂生产的。
抽象工厂:
某商家需要订购一系列的汽车包括所有车型,现在有两家提供,需要从中选择一家,如果后继发现这个厂家提供的车有烧机油现象,那么可以直接更换另一家不烧机油的 :)。
总结一下:
简单工厂
一个工厂管理多个产品。通过简单的逻辑生产不同的产品。一次只提供一个产品。
最大的问题存在于,有时添加一个新的产品需要修改工厂类,这一点不符合开闭原则。
工厂方法
在结构上与简单工厂唯一不同的是,工厂类增加了一个父类,目的在于,对于使用者多了一个层次,将具体的生产延迟到子类完成。有了一个抽象父类之后呢,添加一个新的产品就不需要修改原有的工厂了,只需要再添加一个新的工厂就可以了。
另外一点需要说明的是,我看到很多文章有说简单工厂是通过参数来生产不同的产品,这个只是一个方面,其实简单工厂也可以能通过范型模板类实现一个工厂生产多种产品,也可以添加新的产品不修改工厂类。但是,它最重要的缺陷是,当必须修改工厂代码来生产一个新的产品时,找不到一个不修改原有工厂类代码的方法(注意:修改代码指修改工厂或产品本身,不包括修改调用者)。
抽象工厂
抽象工厂中生产的是一系列的产品非单一产品,整个系统中需要的一个系列的产品都在一个具体工厂中生产。
解决的问题是 “新系列”的变化。而且整个系统中应该只有一个具体工厂实例存在。当有新的工厂实例出现就可以直接替换掉现有的工厂。
例如:
以画面样式为例吧,一般情况下画面包含:标题,时间,内容,作者,但在不同的样式下,它们的显示风格都不同。未来也会有新的样式,新的显示风格。
把提代画面样式的放到一个抽象工厂中,当有了新的样式之后,直接再新一个工厂并且实例化之后,整个页面的风格就随之变化,是不是看起来很高大上?
经典的工厂方法代码结构,实例的工厂是通过泛型模板类实现的,直接传入不同的产品类,就可以生产不同的实例,大大提高效率。大家可以直接使用。
public interface FactoryInterface {
}
public interface ProductInterface {
public ProductInterface newInstance();
}
public class product implements ProductInterface{
@Override
public ProductInterface newInstance() {
return null;
}
}
public class FactoryTemplate implements FactoryInterface {
public T getProduct(Class<T> c) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
T p = (T) Class.forName(c.getName()).newInstance();
return p;
}
}
===============================
APP 开发那些事(微信号:app-go),欢迎留言一起探讨
联系客服