设计模式-工厂方法

Posted bateman6988

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-工厂方法相关的知识,希望对你有一定的参考价值。

 一。概念

         工厂方法模式是类的创建模式,又叫虚拟构造子模式(virtual constructor) 或者多态性工厂模式。

二。模式动机

          定义一个抽像的工厂,将产品的具体创建工作推迟到抽像工厂的具体子类中,有些产品的创建非常复杂,试想如果将所有具体产品的创建工作都像简单工厂一样放到一个静态工厂方法中,那么这个工厂方法将无比巨大,且当需要扩展增加新的产品时,就必须修改原先的工厂方法,违背了开-闭原则,而工厂方法模式,对于每个具体产品的创建都有一个具体的工厂来创建,如果新增产品,只需要新增一个实现抽像工厂(或工厂接口)的具体工厂即可,也符合了开-闭原则。

三。模式的结构

      

     

        从上图中我们可以看出,工厂方法涉及到4个角色

       1.抽像工厂角色:该角色是工厂方法模式的核心,与应用程序无关,任何在模式中创建对像的工厂都必须实现这个接口,该角色往往是一个抽像的JAVA类或者接口。

       2.具体工厂角色:该角色实现了抽像工厂,创建具体的产品,通常由一个具体的JAVA类来实现。

       3.抽像产品角色:工厂方法模式所创建的产品的超类型,通常是一个JAVA抽像类或者JAVA接口。

       4.具体产品角色:该角色实现了抽像产品接口,工厂方法所创建的每个对像都是这个角色的实例。

 

    样例代码如下:

     

public abstract class Product 
{
   
   /**
    * @roseuid 59AA7B2D03E7
    */
   public Product() 
   {
    
   }
}


public class ConcreteProduct1 extends Product 
{
   
   /**
    * @roseuid 59AA7B2D037A
    */
   public ConcreteProduct1() 
   {
    
   }
}

public class ConcreteProduct2 extends Product 
{
   
   /**
    * @roseuid 59AA7B2D03A1
    */
   public ConcreteProduct2() 
   {
    
   }
}



public abstract class Creator 
{
   
   /**
    * @roseuid 59AA7B1600C6
    */
   public Creator() 
   {
    
   }
   
   /**
    * @return Product
    * @roseuid 59AA77070055
    */
   public abstract Product factoryMethod();
}


public class ConcreteCreator1 extends Creator 
{
   
   /**
    * @roseuid 59AA7B2D031A
    */
   public ConcreteCreator1() 
   {
    
   }
   
   /**
    * @return Product
    * @roseuid 59AA7707007B
    */
   public Product factoryMethod() 
   {
    return new ConcreteProduct1();
   }
}


public class ConcreteCreator2 extends Creator 
{
   
   /**
    * @roseuid 59AA7B2D034C
    */
   public ConcreteCreator2() 
   {
    
   }
   
   /**
    * @return Product
    * @roseuid 59AA7707009B
    */
   public Product factoryMethod() 
   {
        return new ConcreteProduct2();
   }
}


   

public class Client 
{
   private Creator theCreator;
   
   /**
    * @roseuid 59AA7AFC02D7
    */
   public Client() 
   {
               theCreator=new ConcreteCreator();
               Product product=thCreator.factoryMathod();
    
   }
}

 

四。模式样例

      如现在有一个生产轮胎的工厂,该工厂可以生产benz车用的轮胎,还可以生产 bmw车子用的轮胎,后续还有可能生产audi车用的轮胎等等。由于 benz车用的轮态和bmw车子用的轮轮胎可能有比较大的差别,所用的材料和模具都会有所不同,工艺要求也不同,可以说要用不同的产品线(相当于一个子工厂)来生产(实例化),我们就可以用工厂的方法来

 描述轮胎的产生过程,每个轮胎都颜色,都有寿命和胎面宽度等指标,于是我们可以抽像出一个轮胎的接口,所有的轮胎都应该是实现这个接口的类的实例,如下图所示:

 

当我们又增加了一条生产Audi车轮胎的产品线时,工厂方法能很好的适应,如上图我们只需增加一个AudiTire的具体产品类,然后再增加一个实例化该产品类的AudiTireFactory工厂就可以了,其它的工厂及产品类不需要做任何的修改,从此可以看出工厂方法模式对于同一产品等级下增加新的产品时是支持开闭原则的。

 

五。模式的约束

  该模式只针对一个产品等级结构下的产品进行有效扩展,如上例,如果我们要增一个发动机的产品,工厂类就无法适应了。

六。模式的变体与扩展

  如一个轮胎厂,他是benz旗下的子公司,他只生产benz车所使用的轮胎,那么这时抽像工厂类就没有必要了,只需要一个具体工厂就可以了,这时工厂方法模式的多态性工厂功能就退化了,如下图:

 

   

  往往工厂只需要一个实例就可以了,所以上图工厂类的factoryMethod()就可以直接改为静态的方法,这样就直接退化为了简单工厂模式。

    该工厂只生产benz车轮胎,那么轮胎的抽像接口其实也没有必要了,可以进一步退化如下图:

            

 

七。与其它模式的关系

  暂略

八。模式优缺点

  工厂方法模式,在同一个产品等级结构下,可以有效的支持开闭原则,但是不适用于增加新的产品等级结构

 

以上是关于设计模式-工厂方法的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之工厂方法和抽象工厂

设计模式-简单工厂工厂方法模式抽象工厂模式详解

设计模式-工厂方法模式(Go实现)

工厂方法模式

C++工厂模式(简单工厂工厂方法抽象工厂)

C++工厂模式(简单工厂工厂方法抽象工厂)