设计模式——简单工厂模式、工厂方法模式和抽象工厂模式

        设计模式是人们从长期的软件开发实战中总结出来的一些经验之谈,为软件领域中的开发人员提供了一种使用专家设计经验的有效途径,通常是多个设计模式结合使用。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,只有通过大量的编程实践才能真正领悟设计模式的精髓。在参加校招前我翻看了部分设计模式相关的书,对于每个设计模式模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式》两本书以及借鉴其他博客园博文的优秀部分。本文介绍工厂模式的实现。希望对大家加深对设计模式的理解有一点帮助。

工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式

 

一、简单工厂模式

 

        简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品当增加新的产品时,就需要修改工厂类。举个例子,有一家电子产品生产厂家,它只有一个工厂,能够生产两种型号的产品,A 和 B。可以想像一下,A是电吹风,B是电风扇。客户需要什么样的吹风类产品,一定要显示地告诉生产工厂。


#include 
     
     
      
      
#include 
      
      
       
       
using namespace std;

enum CTYPE{PRODUCT_A,PRODUCT_B};//产品类型

//抽象产品类
class Product
{
public:
	virtual void Show() = 0;//定义纯虚函数
};

//具体产品类A
class ProductA:public Product
{
public:
	void Show()//实现基类的纯虚函数
	{
		cout<<"Produce A"<
       
       
        
        Show();

	delete pro;
	
	return 0;
}

       
       
      
      
     
     

缺点:

        由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类。

 

打个比方:

       这个工厂在刚建厂时,就要事先把以后的要生产的产品考虑好,部门划分好。如果要生产新的产品,就要改变工厂的空间布局,部门也要重新划分,这是很不利的。当然如果工厂以后发展不大,也就是创建的对象比较少时,还是可以用的。

 

二、工厂方法模式

       所谓工厂方法模式,是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

        还以刚才的例子解释,这家电子厂赚了不少钱,于是决定再开设一个厂,其中一个工厂专门用来生产A型号的产品,也就是只生产电吹风,而另一工厂专门用来生产B型号的产品,也就是只生产电风扇,这样分工明确了。以后客户要再下定单时,可以直接找到相关的工厂了,比如要A型号的产品,就找A工厂要,不再担心下的定单是A,生产出来的是B产品了。


 
#include
    
    
     
     
usingnamespacestd;
 
classProduct   
{   
public:   
        virtualvoidShow()=0;//定义纯虚函数
};   
 
//产品A 
classProductA:publicProduct   
{   
public:   
        voidShow()  //实现基类的纯虚函数
        { 
               cout<<"ProductA"<
     
     
      
      CreateProduct();//生产产品 
       
        p->Show(); 
 
        delete fac;
        deletep;
       
        return0; 
} 
     
     
    
    

            

        其实你会发现,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,你想要加功能,本来是改工厂类的,而现在是修改客户端。

这有什么好处呢?举个例子,有三个客户原来要A产品,现在改卖B产品,在代码中体现为:

 

简单工厂的处理:

 

Factoryfac;//工厂 

 

Product*pro1=fac.CreateProduct(PRODUCT_A);//生产产品A 

Product*pro2=fac.CreateProduct(PRODUCT_A);//生产产品A 

Product*pro3=fac.CreateProduct(PRODUCT_A);//生产产品A 

 

//改为B产品,这里要改三个地方 

//Product*pro1=fac.CreateProduct(PRODUCT_B);//生产产品B 

//Product*pro2=fac.CreateProduct(PRODUCT_B);//生产产品B 

//Product*pro3=fac.CreateProduct(PRODUCT_B);//生产产品B 

 

pro1->Show(); 

pro2->Show(); 

pro3->Show(); 

 

工厂方法的处理:

Factory*fac=newFactoryA();//A工厂 

 

//改为B产品,这里只改一个地方 

//Factory*fac=newFactoryB();//B工厂 

 

Product*pro1=fac->CreateProduct();//生产产品 

Product*pro2=fac->CreateProduct();//生产产品 

Product*pro3=fac->CreateProduct();//生产产品 

 

pro1->Show(); 

pro2->Show(); 

pro3->Show(); 

 

        这里可以看到工厂方法的好处了吧,工厂方法模式是简单工厂模式的进一步抽象和推广,它集中封装了对象的创建,使得要更换产品时,不需要做大的改动就可以实现,降低了客户程序与产品对象的耦合

优点:

       相对于简单工厂模式来说,这样分工更加明确,当需要新产品时,就建一个新的工厂,而不是对原工厂类进行修改。这样做满足了"开放-封闭"原则,即对扩展是开放的,对修改封闭的。

 

缺点:

1. 每增加一种产品,就需要增加一个对象的工厂。在C++实现中,就是要定义一个个的工厂类。显然,相比简单工厂模式,工厂方法模式需要更多的类定义。

2. Factory 模式仅仅局限于一类类(就是说Product 是一类,有一个共同的基类),如果我们要为不同类的类提供一个对象创建的接口,那就要用AbstractFactory了。

 

打个比方:

       如果这家公司发展迅速,推出了很多新的产品,那么就要开设相应的新工厂,一种产品一个工厂。这对于客户来说是好事,分工明确了;但对于工厂自己来说开销也变大了。如要我想要生产核心芯片,但是芯片不是产品,不能继承于product类。因为产品和零部件,不是一类

 

三、抽象工厂模式

 

        抽象工厂模式,它定义为提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。还以上面的例子解释,这家公司经营的还不错,针对其核心技术都申请了专利,后来生始生产相关电子芯片了 (像三星一样,即生产产品也生产芯片)。对于这种情况,我们不能在抽象产品类上继承一个零部件,因为产品和芯片没有什么共同之处,完全是两个领域。你要做芯片,就要专心做,当成一个新的领域,不能用以前产品的那一套流程。这样划分才明确,才能更好的实现高内聚,低耦合的明标。


 
#include
    
    
     
     
usingnamespacestd;
 
//抽象产品类 
classProduct 
{   
public:   
    virtualvoidShow()=0; 
}; 
 
//产品A 
classProductA:publicProduct   
{   
public: 
    voidShow() 
    { 
       cout<<"ProductA"<
     
     
      
      CreateProduct();//生产产品 
    Chip*chip=factury->CreateChip();//生产芯片 
 
    product->Show(); 
    chip->Show(); 
 
    return0; 
} 
     
     
    
    

 

我们可以发现,抽象工厂比工厂模式所能处理的产品更多,最关健的是这些产品有不同的基类。

 

优点:

1、AbstractFactory 模式关键就是将这一组对象的创建封装到一个用于创建对象的工厂类(ConcreteFactory)中,维护这样一个工厂创建类总比维护 n 多相关对象的创建过程要简单的多。

2、它的最大好处是易于交换产品系列,比如我要B工厂的产品,只需要在客户端代码修改一处即可。

 

打个比方:

        这时客户只要知道A工厂是生产A类的产品和芯片的,B工厂是生产B类的,其它都不用关心,只要想要与A类相关的东西就去找A就行了。

 

四、 总结:

1. 简单工厂模式,所有的产品都在工厂类中进行生产。功能单一时,没有什么问题,但是当增加很多新产品时,就要不断的修改产品类,易于出错,也违反了对修改是封闭的原则。

2. 工厂方法模式,每个工厂生产一种产品,这样分工更加明确。当增加新产品时,只需增加一个工厂类,而不用修改原有工厂类,这样工厂类的耦合度就降低了。

3. 抽象工厂模式,比工厂方法模式处理的情况更多。主要是对不同产品的处理,这时的工厂能够生产多种产品,这多种产品虽然没有共同基类,但是却属于一类,具体体现在都是由同一个工厂生产。

 

         好啦,享元模式就介绍到这里了,希望你已经掌握了这个模式并且可以熟练的使用它,那么本博文的效果就达到了。如果你还觉得意犹未尽,那么可以去看看博主的其他设计模式的介绍哦。

 

       关于设计模式,我推荐大家看看以下博客写的博文,关于设计模式的讲解将的特别好,我从中学习了很多,我的设计模式中的部分博文就是从这里借鉴过来的。

      博客链接:http://blog.csdn.net/wuzhekai1985

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值