工厂模式、工厂方法模式和抽象工厂模式的差别分析

工厂模式的好处就在于将工厂和产品之间的耦合下降,将具体产品的构造过程放在了具体工厂类里面。在之后扩展产品的时候方便不少,只须要添加一个工厂类,一个产品类,就能方便的添加产品,而不须要修改原有的代码。而在简单工厂中,若是要增长一个产品,则须要修改工厂类,增长if/else分支,或者增长一个case分支,工厂模式符合软件开发中的OCP原则(open close principle),对扩展开放,对修改关闭。
抽象工厂模式:这个模式我老是感受和builder模式很是类似。
工厂方法模式提供的是对一个产品的等级模式,而抽象工厂方法提供的是对多个产品的等级模式,注意,这里的多个具体产品之间是相互耦合的,也就是说这里的抽象工厂提供的产品之间是存在某种联系的。
有人作以下的比较:
工厂方法模式:一个抽象产品类,能够派生出多个具体产品类。
一个抽象工厂类,能够派生出多个具体工厂类。
每一个具体工厂类只能建立一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每一个抽象产品类能够派生出多个具体产品类。
一个抽象工厂类,能够派生出多个具体工厂类。
每一个具体工厂类能够建立多个具体产品类的实例。
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能建立一个具体产品类的实例,而抽象工厂模式能够建立多个。
下面是一个形象的比喻:
不管是简单工厂模式、工厂模式仍是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留做接口,以达到最大程度上的复用。拿一个生产水杯(cup)的工厂举例:起初,不用工厂模式,我必须在生产水杯以前知道水杯的材料和形状等水杯的全部特征才能生产,这就是咱们的new Cup();这个Cup必须是具体的。厂主发现同一形状的被子,只是材料不一样,如一个是玻璃(glass)的,一个是瓷(china)的,可是确要两条生产线,显然有资源浪费的嫌疑。如今厂主生产杯子时先不让生产线知道我要产的是玻璃的仍是瓷的,而是让它在不知道具体材料的状况下先作它能作的,等到它把模具作好,只须要向其中填充玻璃原料或者瓷原料就能够造出同一形状的具体杯子了。可是很惋惜,java并不能new一个抽象的Cup,因此就有了简单工厂模式。原来是Cup cup=new Cup;如今是SimpleCupFactory.createCup(String cupName),根据cup的名字生产Cup,而createCup返回的是一个实现了 Cup接口或抽象类的具体Cup。简单抽象工厂模式有一个问题,就是当我如今想生产一个一样形状的铁杯时,工厂里并无定义相应的处理流程,只能更改createCup方法,这就不合理了。我如今只是想生产铁杯,你只要在最后的时候把玻璃原料换成铁的不就好了吗,干吗还要更改整条生产线呢?因而就有了工厂模式。原来生产线在生产模具的时候还要考虑是为玻璃杯生产的模具仍是为铁杯生产的模具,如今它不用管了。CupFactory.createCup()建立Cup.CupFactory是接口或抽象类。实现它的具体子类会建立符合Cup接口的具体Cup。那么如今厂主想要生产水壶(kettle),用工厂模式就不得再也不造一条水壶生产线,能不能在水杯生产线同时生产水壶呢?这就是抽象工厂模式。
 java

相关文章
相关标签/搜索