abstract factory模式

本文介绍抽象工厂模式的设计理念,通过示例代码展示了如何创建一系列相关或相互依赖的对象,同时保持高度的灵活性。重点讲解了模式的实现原理及应用场景。

意图:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们的具体的类。也就是协调对象的实例化。

ap_control有责任知道如何与合适的对象协同工作,resfactory有责任决定哪些对象是合适的。我可以使用不同的工作对象乃至只使用一个工作对象(用switch语句)。

使用到的策略:

1.发现并封装变化点

使用哪个驱动对象的选择是弯的,所以我将它封装在res_factory类中。

2.优先使用对象组合而不是类继承

将变化点放在一个独立的对象(res_factory对象)中并让ap_cotrol对象使用它,而不是拥有两类不同的ap_control对象。

3.针对接口设计而不是实现设计

ap_control知道怎么向res_factory请求实例化驱动对象,它不知道res_factory对象实际如何响应这一请求。

 

在工作模式中:

客户对象只知道向谁请求需要的对象 和如何使用这些对象

具体工厂指定哪 些对象被实例化。

抽象工厂类通过为每种不同类型的对象定义一个来指定哪些对象可以被实例化。

 

决定需要哪 个工作对象实际上是判断需要哪 系列的对象。

 

抽象工厂模式给了我们一种新的分解:根据责任分解:

1.谁在使用我们的对象  客户

2.谁来决定使用哪些特定的对象 工厂

 

 

UML结构图:

 

 

 

实现:
1)AbstractFactory.h

/* *******************************************************************
    created:    2006/07/19
    filename:     AbstractFactory.h
    author:        李创
                
http://www.cppblog.com/converse/

    purpose:    AbstractFactory的演示代码
********************************************************************
*/


#ifndef ABSTRACTFACTORY_H
#define  ABSTRACTFACTORY_H

//  抽象基类AbstractProductA,代表产品A的抽象
class  AbstractProductA
{
public :
    AbstractProductA() 
{}
    
virtual   ~ AbstractProductA() {} ;
}
;

//  派生类ConcreateProductA1,继承自 AbstractProductA,代表产品A的第一种实现
class  ConcreateProductA1
    : 
public  AbstractProductA
{
public :
    ConcreateProductA1();
    
virtual   ~ ConcreateProductA1();
}
;

//  派生类ConcreateProductA2,继承自 AbstractProductA,代表产品A的第二种实现
class  ConcreateProductA2
    : 
public  AbstractProductA
{
public :
    ConcreateProductA2();
    
virtual   ~ ConcreateProductA2();
}
;

//  抽象基类AbstractProductB,代表产品B的抽象
class  AbstractProductB
{
public :
    AbstractProductB() 
{}
    
virtual   ~ AbstractProductB() {} ;
}
;

//  派生类ConcreateProductB1,继承自 AbstractProductB,代表产品B的第一种实现
class  ConcreateProductB1
    : 
public  AbstractProductB
{
public :
    ConcreateProductB1();
    
virtual   ~ ConcreateProductB1();
}
;

//  派生类ConcreateProductB2,继承自 AbstractProductB,代表产品B的第二种实现
class  ConcreateProductB2
    : 
public  AbstractProductB
{
public :
    ConcreateProductB2();
    
virtual   ~ ConcreateProductB2();
}
;

//  抽象基类AbstractFactory,工厂的抽象类,生产产品A和产品B
class  AbstractFactory
{
public :
    AbstractFactory()
{}
    
virtual   ~ AbstractFactory() {}

    
virtual  AbstractProductA *  CreateProductA()  =   0 ;
    
virtual  AbstractProductB *  CreateProductB()  =   0 ;
}
;

//  派生类ConcreateFactory1,继承自AbstractFactory
//  生产产品A和产品B的第一种实现
class  ConcreateFactory1
    : 
public  AbstractFactory
{
public :
    ConcreateFactory1();
    
virtual   ~ ConcreateFactory1();

    
virtual  AbstractProductA *  CreateProductA();
    
virtual  AbstractProductB *  CreateProductB();
}
;

//  派生类ConcreateFactory2,继承自AbstractFactory
//  生产产品A和产品B的第二种实现
class  ConcreateFactory2
    : 
public  AbstractFactory
{
public :
    ConcreateFactory2();
    
virtual   ~ ConcreateFactory2();

    
virtual  AbstractProductA *  CreateProductA();
    
virtual  AbstractProductB *  CreateProductB();
}
;

#endif


2)AbstractFactory.cpp

/* *******************************************************************
    created:    2006/07/19
    filename:     AbstractFactory.cpp
    author:        李创
                
http://www.cppblog.com/converse/

    purpose:    AbstractFactory的演示代码
********************************************************************
*/


#include 
< iostream >
#include 
" AbstractFactory.h "

ConcreateProductA1::ConcreateProductA1()
{
    std::cout 
<<   " construction of ConcreateProductA1/n " ;
}


ConcreateProductA1::
~ ConcreateProductA1()
{
    std::cout 
<<   " destruction of ConcreateProductA1/n " ;
}


ConcreateProductA2::ConcreateProductA2()
{
    std::cout 
<<   " construction of ConcreateProductA2/n " ;
}


ConcreateProductA2::
~ ConcreateProductA2()
{
    std::cout 
<<   " destruction of ConcreateProductA2/n " ;
}


ConcreateProductB1::ConcreateProductB1()
{
    std::cout 
<<   " construction of ConcreateProductB1/n " ;
}


ConcreateProductB1::
~ ConcreateProductB1()
{
    std::cout 
<<   " destruction of ConcreateProductB1/n " ;
}


ConcreateProductB2::ConcreateProductB2()
{
    std::cout 
<<   " construction of ConcreateProductB2/n " ;
}


ConcreateProductB2::
~ ConcreateProductB2()
{
    std::cout 
<<   " destruction of ConcreateProductB2/n " ;
}


ConcreateFactory1::ConcreateFactory1()
{
    std::cout 
<<   " construction of ConcreateFactory1/n " ;
}


ConcreateFactory1::
~ ConcreateFactory1()
{
    std::cout 
<<   " destruction of ConcreateFactory1/n " ;
}


AbstractProductA
*  ConcreateFactory1::CreateProductA()
{
    
return   new  ConcreateProductA1();
}


AbstractProductB
*  ConcreateFactory1::CreateProductB()
{
    
return   new  ConcreateProductB1();
}


ConcreateFactory2::ConcreateFactory2()
{
    std::cout 
<<   " construction of ConcreateFactory2/n " ;
}


ConcreateFactory2::
~ ConcreateFactory2()
{
    std::cout 
<<   " destruction of ConcreateFactory2/n " ;
}


AbstractProductA
*  ConcreateFactory2::CreateProductA()
{
    
return   new  ConcreateProductA2();
}


AbstractProductB
*  ConcreateFactory2::CreateProductB()
{
    
return   new  ConcreateProductB2();
}


3)Main.cpp(测试代码)

/* *******************************************************************
    created:    2006/07/19
    filename:     Main.cpp
    author:        李创
                
http://www.cppblog.com/converse/

    purpose:    AbstractFactory的测试代码
********************************************************************
*/


#include 
" AbstractFactory.h "
#include 
< stdlib.h >

int  main()
{
    
//  生产产品A的第一种实现
    ConcreateFactory1  * pFactory1  =   new  ConcreateFactory1;
    AbstractProductA 
* pProductA  =  pFactory1 -> CreateProductA();

    
//  生产产品B的第二种实现
    ConcreateFactory2  * pFactory2  =   new  ConcreateFactory2;
    AbstractProductB 
* pProductB  =  pFactory2 -> CreateProductB();

    delete pFactory1;
    delete pProductA;
    delete pFactory2;
    delete pProductB;

    system(
" pause " );

    
return   0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值