2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有 的代码。可以看出工厂角色的结构也是符合开闭原则的!
代码如下:
产品类:
<?php /** * 车子系列 * */ abstract Class BWM{ function __construct($pa) { } } Class BWM320 extends BWM{ function __construct($pa) { } } Class BMW523 extends BWM{ function __construc($pb){ } }
创建工厂类:
/** * 创建工厂的接口 * */ interface FactoryBMW { function createBMW(); } /** * * 创建BWM320车 */ class FactoryBWM320 implements FactoryBMW { function createBMW($type){ return new BWM320(); } } /** * * 创建BWM523车 */ class FactoryBWM523 implements FactoryBMW { function createBMW($type){ return new BMW523(); } }
客户类:
/** * * 客户得到车 */ class Customer { private $BMW; function getBMW($type){ switch ($type) { case 320: $BWM320 = new FactoryBWM320(); return $BWM320->createBMW(); case 523: $BWM523 = new FactoryBWM523(); return $BWM320->createBMW(); //.... } } }
可以看出工厂方法的加入,使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。因为如果不能避免这种情 况,可以考虑使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实 现。
工厂方法小结:
工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口。那我们是否一定要在代码中遍布工厂呢?大可不必。也许在