工厂方法C,设计形式

工厂方法C++完结

厂子方法形式的概念

工厂方法格局(FACTO本田CR-VY
METHOD)是一种常用的指标创设型设计情势,此模式的中坚精神是封装类中不变的一对,提取在那之中本性化善变的壹些为独立类,通过信赖注入以达到解耦、复用和方便人民群众前期维护举行的目标。它的为主结构有五个剧中人物,分别是架空工厂;具体育工作厂;抽象产品;具体产品。

图片 1

从地点的图能够看看:Product为架空产品类,负责产品的共性;Creator为架空创立类;而现实的成品(ConcreteProduct)是由落成工厂ConcreteCreator完成的。

1描述

概念2个用于成立对象的接口,让子类决定实例化哪贰个类。工厂方法使一个类的实例化延迟到其子类

厂子方法格局详解及举例

1.首先先用代码解释一下上面的图:

一.抽象产品类

public
abstract
class
Product
{  
   //全体产品类的国有事务方法
 
   public
void
method1()
{  
       //公共措施的贯彻
 
   }  

   //注解抽象业务方法
 
   public
abstract
void
method2();
 
}

 

二.有血有肉产品类

public
class
ConcreteProduct1
extends
Product{
 
   //达成工作方法
 
   public
void
method2()
{  
       //业务方法的贯彻
 
   }  
}

public
class
ConcreteProduct2
extends
Product{
 
   //落成工作方法
 
   public
void
method2()
{  
       //业务方法的贯彻
 
   }  
}

 

叁.架空工厂类

public
abstract
class
Creator{
 

 //
 public abstract Product createProduct(String arg);
public
abstract
<T extends Product> T createProduct(Class<T>
c);
}

 

四.具体育工作厂类

public
class
ConcreteCreator
extends
Creator{
 

public
<T extends Product> T
createProduct(class<T>
c){
Product product=null;
try{
      product =(T)Class.forName(c.getName()).newInstance();
}catch
(Exception e){
   
}
return
(T)product;
}

}

 

5调用:

       Creator creator=new
ConcreteCreator();
       Product product=creator.createProduct(ConcreteProduct1.class);
      //
product.method2();

 

依据下边的代码应该看懂了吗?假诺不懂上面笔者切实举个例子:

二.举例

大家拿手提式有线电话机举例,一个有线电话工厂生产二种手提式有线电话机,分别是国产手提式有线电话机和华为手提式有线电话机。进程正是在工厂经过壹密密麻麻的加工创立生产出那三种手提式有线电话机,下边用代码来演示一下:

一.虚幻产品类,也就是二种无绳电话机的共性:

概念了七个主意,3个是打电话,二个是手提式有线电话机的品牌,二种无绳电话机的品牌是区别的,所以是抽象的。

public
abstract
class
Phone
{
   //两种无绳电话机都可以通话
   public
void
Call()
{
       //公共艺术的落实
   }

   //三种手机都有品牌,不过品牌分裂,所以是画饼充饥的
   public
abstract
void
PhoneBrand();
}

 

贰.切实可行的产品类,
便是One plus手提式有线电话机和红米手提式有线电话机多个产品

public
class
HUAWEIPhone
extends
Phone
{
   //品牌
   @Override
   public
void
PhoneBrand()
{
       Log.e(“qzs”,”作者的品牌是BlackBerry”);
   }
}

public
class
MIPhone
extends
Phone
{
   //品牌
   @Override
   public
void
PhoneBrand()
{
       Log.e(“qzs”,”小编的品牌是Samsung”);
   }
}

 

3.浮泛工厂类,要想生养手提式有线电话机就非得要有工厂,所以先要定义生产无绳电电话机的抽象方法。

public
abstract
class
PhoneFactory
 {
   public
abstract
<T extends Phone> T createPhone(Class<T>
c);
}

 

4.具体育工作厂类,具体的生育手提式有线电电话机的方法

public
class
ConcretePhoneFactory
extends
PhoneFactory
{

   @Override
   public
<T extends Phone> T
createPhone(Class<T>
c) {
       Phone phone=null;
       try{
           phone =(Phone)Class.forName(c.getName()).newInstance();
           Log.e(“qzs”,”生产了一个有线电话”);
           phone.PhoneBrand();
       }catch
(Exception e){

       }
       return
(T) phone;
   }
}

 

调用:

 
 
   PhoneFactory phoneFactory=new ConcretePhoneFactory();
       Phone
huaiweiphone=phoneFactory.createPhone(HUAWEIPhone.class);
       Phone
miphone=phoneFactory.createPhone(MIPhone.class);

 

运作的结果如下,能够见到生产了三种无绳电话机,这一次工厂方法情势是还是不是有了特别清楚的认识。

二类图描述

图片 2

工厂方法情势区别款型

1.不难工厂格局

尽管把抽象工厂类去掉,具体育工作厂类的章程上加上static,拿地方的例证表达:

public
class
ConcretePhoneFactory
{

   public
 static
<T extends Phone> T
createPhone(Class<T>
c) {
       Phone phone=null;
       try{
           phone =(Phone)Class.forName(c.getName()).newInstance();
           Log.e(“qzs”,”生产了2个手机”);
           phone.PhoneBrand();
       }catch
(Exception e){
       }
       return
(T) phone;
   }
}

 

二.多厂子方法方式

从名字就能够看出来,是有多个有血有肉工厂类,上边包车型地铁事例是二种手提式有线电话机都位于了一个厂子了,现实的话应该在五个工厂生产,约等于多工厂方法格局。

分为多个工厂后,抽象工厂类就不用传参了,因为每一种手机都有友好工厂了。

修改后的虚幻工厂类:

public
abstract
class
PhoneFactory
 {
   public
abstract
 Phone createPhone();
}

 

修改的切实可行工厂类:

public
class
ConcreteHUAWEIFactory
extends
PhoneFactory
{
   @Override
   public
Phone createPhone()
{
       Log.e(“qzs”,”生产了三个魅蓝手机”);
       return
new
HUAWEIPhone();
   }
}

public
class
ConcreteMIFactory
extends
PhoneFactory
{
   @Override
   public
Phone createPhone()
{    
       Log.e(“qzs”,”生产了2个OPPO手提式有线话机”);
       return
new
MIPhone();
   }
}

 

3.工厂方法格局来促成单例形式

单例形式的主干供给便是在内部存储器中只有一个对象,通过工厂方法格局也得以只在内部存款和储蓄器中生产一个指标。

public
class
Singleton
{  
 
   private
Singleton()
{  
 
   }  
 
   public
void
doSomething()
{  
       System.out.println(“具体逻辑”);
 
   }  
}

 

由此获得类构造器,然后设置访问权限,生成三个对象,然后提供外部访问,保障内部存款和储蓄器中的对象唯一。

public
class
SingletonFactory {  
 
   private
static
Singleton singleton;  

   static
{  
       try
{  
           Class clazz = Class.forName(Singleton.class.getName());  
           Constructor constructor
= clazz.getDeclaredConstructor();  
           constructor.setAccessible(true);
 
           singleton = (Singleton)
constructor.newInstance();
 
       } catch (Exception
e) {  
 
       }
   }  
 
   public static Singleton getSingleton() {  
 
       return singleton;  
   }  
}

 

调用:

       Singleton singleton =
SingletonFactory.getSingleton();  
       Singleton singleton2 = SingletonFactory.getSingleton();  
       System.out.println(singleton);
 
       System.out.println(singleton2);

打印后发觉目的是相同的。

 

图片 3

 

肆.延迟开端化

2个对象被消费实现后,并不如时释放,工厂类保持其伊始状态,等待再一次被使用。

三代码达成:

class Product

{

protected:

  Product();

public:

    virtural ~Product() = 0;

};

class ConcreteProduct: public Product

{};

 

class Creator

{

protected:

   Creator();

public:

  //主题接口所在,该措施定义产品生成

    virtual Product*FactoryMethod() =  0;

  virtual ~Creator() = 0;

};

class ConcreteCreator:public Creator

{

public:

 Product * CreatProduct()

   {

        retun new ConcreteProduct();

   }

};

工厂方法形式优缺点

1.优点

  • 工厂方法格局是完全符合开闭原则的;

  • 厂子形式是1种典型的解耦方式,能够降低对象时期的耦合度;

  • 厂子格局是注重抽象架构的,它把实例化产品的天职交由达成类成就,扩张性相比较好。

  • 能够使代码结构清晰,有效地包裹变化。

  • 对调用者屏蔽具体的产品类。如若使用工厂格局,调用者只关怀产品的接口就足以了,至于具体的落成,调用者根本无需关心。固然改变了具体的兑现,对调用者来说没有任何影响。

2.缺点

 不难的目的应用时,不吻合工厂方法形式。

4 问题

在第22中学落到实处的厂子方法中,因为实际的工厂生产Product都是特定在Create函数中贯彻的。所以当ConcreteProduct
类型增多时,大概就需求决策具体实例化哪个Product了

那么,

消除方案得以是

壹给CreateProduct扩张参数进行裁定;

Product *ConcreteCreator::CreatProduct(int index)

{

  switch(index)

  {

    case 1:

       return ConcreteProduct1();

    break;

    case 2:

       return ConcreteProduct2();

    break;

  }

}

贰采纳模板方法,由用户需要决定具体的实例化对象类型。

template<class T>

Product *ConcreteCreator<T>::CreatProduct()

{

  return T();

}

方式应用

工厂方法常常用在以下三种景况中:

  • 首先种情形是对于有个别产品,调用者清楚地通晓应该利用哪个具体育工作厂劳动,实例化该具体育工作厂,生产出切实可行的制品来。Java
    Collection中的iterator() 方法即属于那种景况。

  • 其次种情景,只是须要壹种产品,而不想精晓也不供给驾驭到底是哪些工厂为生育的,即最终选拔哪个具体育工作厂的决定权在劳动者壹方,它们依据当前系统的状态来实例化三个切实的工厂回到给使用者,而以此决定进程那对于使用者来说是晶莹的。

作品学习参考了《设计格局之禅》

图片 4

自身建立一个Android新人沟通群,如若您是Android刚入门大概打算攻读Android能够加一下:

图片 5

 群号:458739310

推荐介绍阅读

 

 

   谷歌(Google)-201八对Android开发者的八个指令!

 

  「福利篇」-IT能源分享合集(录像获取)

 

 
  深远精晓MV**模式

图片 6

伍工厂方法应用

①优点:

大好封装,创立产品只需求精通类型就好,具体创立由工厂回到

扩大性强,当产品项目增多,代码全体结构并未太大变迁。“拥抱变化”

遮掩产品类,调用者只须要知道产品接口就好

一级的解耦框架。高层只要求驾驭产品的抽象类,符合迪米特法则,注重倒置原则,里氏替换原则

六 应用处境

1她是new产品的2个替代品

二亟需灵活地,可增加的框架是,思量工厂形式

三在异构项目中,能够通过工厂情势实现系统同构化,只供给关进具体的接口接合难题

4在测试驱动开发的框架中。能够经过工厂方法将现实地衡量试者所依靠的其余类虚拟出来,从而幸免耦合

 

7扩展

1 减少为不难工厂情势

方案:

工厂形式:有两样的厂子车间继承自抽象工厂基类,为生育不一致产品而运维。可能如上经过参数字传送递明确生产成品体系

一句话来说工厂:只生育一种商品的厂子。

于是这时的厂子就相应是有血有肉的某2个ConcreteFactory,而不用编造工厂存在

 

二荣升为多个厂子类

描述:

如上所说由参数大概模板方法显著具体产品项目所指是三个得以生产种种连锁产品的工厂了(区别车间生产)

那么要形成拾足职务–1个工厂只生育1种特定产品,就应该将车间等级提高为工厂了。那正是多工厂了

 

落到实处转移:

//三种产品

class ConcreteProduct1:public Product{};
class ConcreteProduct2:public Product{};

class ConcreteCreator1:public Creator

{

public:

  Product ConcreteProduct1* CreatorProduct()

  {

    return new ConcreteProduct1();

  }

};

class ConcreteCreator2:public Creator

{

public:

  Product ConcreteProduct2* CreatorProduct()

  {

    return new ConcreteProduct2();

  }

};

 

3替换单例形式

讲述:因为单例情势抱有,接口少,扩张性差的后天不足,而大家的工厂形式又刚刚拥有那一个天性。那么将之连接,一箭双雕

实现:

class Singleton

{

//保险工厂方法能够调用其构造函数进行伊始化

  friend class SingletonFactory;

protected:

  Singleton(){}

public:

   void doSomething()

  {//业务处理}

};

class SingletonFactory

{

private:

  //包装单例的指针,外部所得永久为那1个指南针。具体的单例明确:RAII(能源获得即发轫化)

  static Singleton *_singleton;

public:

  static Singleton* GetSingleton()

  {

    return _singleton;

  }

};

Singleton * SingletonFactory::_singleton = new Singleton();

 

肆延迟起首化/最阿比让接数难点

题材举例:在系统中,因为能源及CPU限制,往往会有数据库连接数量MAX限制。而连日的数据库类型又或许不一样type一,二,3……..。

探望那些,我们也许会想到多例形式。但是那个难点又存在数据库类型不均等难点了。

于是乎就找到工厂方法了。

 

实现:

class ProductFactory

{

private:

  static Map<string,product> prMap = new
HashMap();//用于已经三番五次数据库的保存

public:

  static product NewConnection(string type)

  {

    Product pr = NULL;

    if(prMap.hasConnention(type))

    {

      pr = prMap.get(type);

 

    }

    else

    {

      //鲜明项目

      switch(type)

      {

      case typePr

        pr = new (typePr);

        prMap.put(typePr);

      }

    }

    return pr;

  }

};

注:以上代码并非可运营的

 

补充:

厂子方式的顶天立地,能够和此外形式混合使用:单例,模板方法,原型格局等。