工厂方法和抽象工厂

转载 2012年03月28日 00:02:28

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

//  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()这两个工厂方法又起到了作用。

简单工厂 工厂方法 抽象工厂 使用方法与区别

简单工厂:是由一个工厂对象决定创建出哪一种产品类的实例。 A实例调用B实例的方法,称为A依赖于B。如果使用new关键字来创建一个B实例(硬编码耦合),然后调用B实例的方法。一旦系统需要重构:需要使用...
  • lqw05
  • lqw05
  • 2016年07月14日 15:04
  • 2157

抽象工厂模式和工厂方法模式区别

首先来看看这两者的定义区别: 工厂模式:定义一个用于创建对象的借口,让子类决定实例化哪一个类 抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类        个...
  • liu88010988
  • liu88010988
  • 2016年03月04日 09:48
  • 3352

设计模式之静态工厂、工厂方法和抽象工厂的联系与区别

解析: 开闭原则:对扩展开放,对修改封闭。静态工厂增加需要是修改源代码,对修改不封闭,不符合开闭原则。...
  • sinat_35512245
  • sinat_35512245
  • 2017年02月06日 11:31
  • 1990

抽象工厂方法

  • 2013年05月02日 00:34
  • 152KB
  • 下载

工厂方法与抽象工厂设计模式

  • 2016年02月09日 21:09
  • 746KB
  • 下载

抽象工厂,适配器,命令,工厂方法,观察者,代理

  • 2007年07月25日 11:30
  • 48KB
  • 下载

Python 抽象工厂方法

有没有好的python UML建模工具?求推荐,除eclipse的插件(因为不喜欢用eclipse)。pyNsource用的不是很好,pyUt不全。 import abc class Abstr...
  • u011659057
  • u011659057
  • 2014年05月21日 10:23
  • 1033

java设计模式——抽象工厂方法

说明:什么使用我们可以使用抽象工厂方法?怎么使用抽象工厂方法 应用场景:当我们建立的两个类之间有组合关系的时候,比如说学校、老师、学生。这那个之间的关系是:学校可以使一中、二中、三中。老师可...
  • h249059945
  • h249059945
  • 2012年04月28日 13:50
  • 421

设计模式-抽象工厂方法

设计模式-抽象工厂方法
  • lqshadan2017
  • lqshadan2017
  • 2017年02月03日 22:51
  • 31

设计模式-2-抽象工厂方法

一、概述 1-抽象工厂 提供一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体的实现类 2-设计原则 (1)开闭(2)多用组合,少继承 抽象工厂和工厂方法的区别 (1)工厂通过继承解耦;抽象...
  • hjw199089
  • hjw199089
  • 2017年04月14日 20:13
  • 122
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:工厂方法和抽象工厂
举报原因:
原因补充:

(最多只允许输入30个字)