设计模式(2)之工厂模式

工厂模式:也叫虚拟构造器模式或者多态工厂模式,他属于类创建模式。在工厂模式中,工厂父类负责定义创建产品对象的接口,而工厂子类则负责商城具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体的产品类。

 
     在工厂模式下,核心的工厂类不再负责所有产品的创建,而是将具体的创建工作交给工厂子类去做。这个核心工厂类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品被实例化的细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。在工厂方法模式下,工厂类与产品类往往具有平行的等级关系,他们之间一一对应。例如显示生活中的手机代工厂,不同品牌的手机应该有不同的公司制造,motorala应该生产motorala手机,nokia应该生产mokia手机,那么抽象层的手机公司生产抽象的手机,而具体的手机公司生产具体品牌的手机。
 
     案例分析:
     需求:一个手机代工厂生产不同品牌的手机,在这个需求上用工厂模式设计相关实现
     伪代码:
     //抽象产品类  monile手机类 它可以是一个抽象类 也是可以是一个借口,其中要报关所有产品类都具有的业务方法create
     public interface Mobile()
     {
          public void create();
     }
     //具体产品类 MotoMobile(),它是一个具体产品,实现了在Mobile中定义的业务方法create(生产手机)
     public class MotoMobile
     {
          public void create()
          {
               echo '我在生产motorala手机';
          }
     }
     //具体产品类 NokiaMobile()
     {
          public void create()
          {
               echo '我在生产nokia手机';
          }
     }
     //工厂父类 它可以是一个接口,也可以是一个抽象类,它定义了抽象的工厂方法produceMobile,返回一个抽象产品Mobile的对象
     public interface MobileFactory()
     {
          public Mobile produceMobile();
     }
     //工厂子类 它是具体工厂类,实现了父类MobileFactory定义的produceMobile方法,返回了一个Mobile对象
     public class MotoMobileFactory extends MobileFactory()
     {
        public Mobile produceMobile()
         {
               echo '我在这里创建了一个生产moto的具体产品类对象';
               return new MotoMobile();
          }
     }
     public class NokiaMobileFactory extends MobileFactory()
     {
          public Mobile produceMobile()
          {
               echo '我在这里创建了一个生产nokia的具体产品类对象';
               return new NokiaMobile();
          }
     }
     
     客户端调用代码:
     $factoryConfig = Confg::get('use_factory');//配置文件中获取指定的生产工厂  比如 nokia
     $obFactory = new $factoryConfg.'Factory';//实例化具体工厂类
      $createObj = $objFactory->produceMobile();//获取具体的产品类对象
     $createObj->create();//生产
 
工厂模式扩展:
     1.可以抽象工厂类中定义多个工厂方法,从而使具体工厂子类实现这些不同的工厂方法,这些方法可以包含不同的业务逻辑,以满足不同的产品对象的需求
     2.在工厂对象中可以根据情况适当的缓存生成的产品对象,已达到对象复用的目的,从而解决系统资源,提高运行效率
 
最后总结:
     1.工厂模式中工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的就是讲产品的实例化工作延迟到子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体的产品类。
     2.工厂模式中包含四个角色:抽象产品父类是定义产品的接口,是工厂方法模式所创建对象的抽象;具体产品实现抽象的产品父类接口,进行产品的具体逻辑操作;抽象工厂父类中声明了工厂方法,用于返回一个具体的产品对象,他是工厂模式的核心,任何在工厂模式下创建对象的工厂类都必须实现此类定义的接口;具体的工厂类是工厂父类的子类,实现工厂父类中的工厂方法,并可由客户端调用返回一个具体产品类的实例。某种类型的具体的产品对象由专门的工厂类创建,他们之间一一对应。
     3.工厂模式下可以做到在不修改工厂角色的情况下增加一个新的产品,除了需求修改一下配置,其他什么都不用做,便可以投入到生产中
     4.工厂模式的主要优点就是增加新的产品类系统无需修改,并封装了产品对象实例化的细节,系统具有良好的灵活性和扩展性;主要缺点是增加新产品的同时需要增加新的工厂,导致系统类的个数成对的增加,在一定程度上增加了系统的复杂性。
     5.工厂类并不是简单的封装实例化产品对象的封装,我们可以在工厂类中做一些更利于系统的一些工作,比如对象的缓存复用
posted @ 2012-08-24 09:56  阿正-WEB  阅读(532)  评论(0编辑  收藏  举报