工厂方法和抽象工厂

来源:互联网 发布:赚钱任务网站源码 编辑:程序博客网 时间:2024/04/28 03:29

工厂方法和抽象工厂实际上是从不同角度在描述问题。
工厂方法描述了具体产品的创建,而抽象工厂描述的是产品系列的组织。

//  Computer.cpp : Defines the entry point for the console application.
//

#include 
" stdafx.h "
#include 
< string >
#include 
< iostream >

using  namespace  std;

class  Ram {};
class  IBMRam: public  Ram {};
class  HPRam: public  Ram {};
class  Cpu {};
class  IBMCpu: public  Cpu {};
class  HPCpu: public  Cpu {};

class  Computer
{
public :
 Computer(
string  strName, Ram*  pRam, Cpu*  pCpu)
 
{
  m_strName 
=  strName;
  m_pRam 
=  pRam;
  m_pCpu 
=  pCpu;
  cout
<< " " << m_strName  <<"  computer is produced" << endl;
 }

 
~ Computer()
 
{
  delete m_pRam;
  delete m_pCpu;
  cout
<< " " << m_strName  <<"  computer is deleted" << endl;
 }

public :
 
string  m_strName;
private :
 Ram
*  m_pRam;
 Cpu
*  m_pCpu;
}
;

class  ComputerProducer
{
public :
 Computer
*  createComputer()
 
{
  
return   new  Computer(setName(), createRam(), createCpu());
 }

 
virtual  Ram*  createRam() =   0 ;
 
virtual  Cpu*  createCpu() =   0 ;
 
virtual   string  setName()  =   0;
}
;

class  IBMProducer: public  ComputerProducer
{
public :
 
virtual  Ram*  createRam()
 
{
  cout
<< " A IBMRam is producted " << endl;
  
return   new  IBMRam;
 }

 
virtual  Cpu*  createCpu()
 
{
  cout
<< " A IBMCPU is producted " << endl;
  
return   new  IBMCpu;
 }

 
virtual   string  setName()
 
{
  
return   string ( "IBM " );
 }

}
;

class  HPProducer: public  ComputerProducer
{
public :
 
virtual  Ram*  createRam()
 
{
  cout
<< " A HPRam is producted " << endl;
  
return   new  HPRam;
 }

 
virtual  Cpu*  createCpu()
 
{
  cout
<< " A HPCPU is producted " << endl;
  
return   new  HPCpu;
 }

 
virtual   string  setName()
 
{
  
return   string ( "HP " );
 }

}
;

int  main( int  argc,  char *  argv[])
{
 
//  client code
 ComputerProducer *  pIBMFac =   new IBMProducer;
 ComputerProducer
*  pHPFac  =   new HPProducer;
 Computer
*  pIBMComputer =  pIBMFac -> createComputer();
 Computer
*  pHPComputer =  pHPFac  -> createComputer();
 delete pIBMComputer;
 delete pHPComputer;
 delete pIBMFac;
 delete pHPFac;
 
return   0 ;
}


这个例子比较清楚了,不同的工厂生产不同的计算机,但计算机的基本组成(这里假设计算机仅由ram和cpu组成)是一样的,这样的产品系列很适合用抽象工厂来组织。
而在实际生产计算机的时候,createRam()和createCpu()这两个工厂方法又起到了作用。

原创粉丝点击