设计模式的C++实现 3.抽象工厂

简单工厂模式和工厂模式 要求 同一类型的产品子类拥有共同的方法,这限制了产品子类的扩展。抽象工厂可以向客户端提供一个接口,是客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。抽象工厂中将同一类的产品子类归为一类,让它们继承同一个抽象子类,将一个抽象子类的具体产品子类视为一组。产品族是指位于不同产品等级结构中,功能相关联的产品组成的家族。一般位于不同等级结构的相同位置上。每一个产品族中的产品数量与产品等级结构的数量相同。用户通过工厂以及族来判断

当用户使用时,必须知道哪个工厂以及哪个产品族的产品类,即通过组和族的二维坐标来确定具体的产品子类。每个工厂子类负责一族产品,且有一个方法来生成一种类型的产品。

举个例子说明。对于抽象工厂基类AbstractFactory派生了 3个具体的工厂类Factory1,Factory2,Factory3,则族数为3,即每个抽象产品类有3个具体子类。若有 2 个抽象产品类AbstractProductA,AbstractProductB,即2个组,则工厂类中有2个创建对象的函数createProductA,createProductB。

简单的实现:

class AbstractProductA{
public:
	virtual void fun() = 0;
	AbstractProductA(){}
	virtual ~AbstractProductA(){}

};
class ProductA_1 : public AbstractProductA{
public:
	virtual void fun(){cout<< "A_1"<<endl;}
	ProductA_1(){}
	virtual ~ProductA_1(){}
};
class ProductA_2 : public AbstractProductA{
public:
	virtual void fun(){cout<< "A_2"<<endl;}
	ProductA_2(){}
	virtual ~ProductA_2(){}
};
class ProductA_3 : public AbstractProductA{
public:
	virtual void fun(){cout<< "A_3"<<endl;}
	ProductA_3(){}
	virtual ~ProductA_3(){}
};

//B组
class AbstractProductB{
public:
	virtual void fun() = 0;
	AbstractProductB(){}
	virtual ~AbstractProductB(){}

};
class ProductB_1 : public AbstractProductB{
public:
	virtual void fun(){cout<< "B_1"<<endl;}
	ProductB_1(){}
	virtual ~ProductB_1(){}
};
class ProductB_2 : public AbstractProductB{
public:
	virtual void fun(){cout<< "B_2"<<endl;}
	ProductB_2(){}
	virtual ~ProductB_2(){}
};
class ProductB_3 : public AbstractProductB{
public:
	virtual void fun(){cout<< "B_3"<<endl;}
	ProductB_3(){}
	virtual ~ProductB_3(){}
};

class AbstractFactory{
public:
	AbstractFactory(){};
	virtual ~AbstractFactory();
	virtual AbstractProductA* createProductA() = 0;
	virtual AbstractProductB* createProductB() = 0;
};
class Factory1:public  AbstractFactory{
public:
	Factory1(){}
	~Factory1(){}
	AbstractProductA* createProductA(){return new ProductA_1();}
	AbstractProductB* createProductB(){return new ProductB_1();}
};
class Factory2:public  AbstractFactory{
public:
	Factory2(){}
	~Factory2(){}
	AbstractProductA* createProductA(){return new ProductA_2();}
	AbstractProductB* createProductB(){return new ProductB_2();}
};
class Factory3:public  AbstractFactory{
public:
	Factory3(){}
	~Factory3(){}
	AbstractProductA* createProductA(){return new ProductA_3();}
	AbstractProductB* createProductB(){return new ProductB_3();}
};

抽象工厂的用处,其原始意义是为了UNIX 和Windows,两者许多操作是相同的,这些相同的对象如File,Button等,这些东西分别为Windows族和Unix族各有一份,而对File这样对象的工厂类称Unixfile和Windowsfile为一组,进行结构化的划分。

抽象工厂支持不同类型的产品,更加方便的使用同一族中间的不同类型的产品。增加一族产品时,不修改工厂类和产品类的接口,不违背开闭原则。

缺点:结构过于臃肿,即使我只是简单实现,而3x2,就写了以上如此多的代码。如果产品组数变多或族数增加,都会使其难以管理。每次增加一组产品,工厂类和产品类接口都要修改,违背开闭原则。

时间: 2024-10-29 19:05:36

设计模式的C++实现 3.抽象工厂的相关文章

23种设计模式(3):抽象工厂模式

定义:为创建一组相关或相互依赖的对象提供一个接口,并且无需指定他们的详细类. 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的差别 抽象工厂模式是工厂方法模式的升级版本号,他用来创建一组相关或者相互依赖的对象.他与工厂方法模式的差别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的多个产品等级结构.在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的全部产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类

设计模式【3】:抽象工厂

在网上看到一篇总结的比较好的文章,就借鉴下来共享: 定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的区别 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象.他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的多个产品等级结构.在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽

【C#设计模式——创建型模式】抽象工厂模式

抽象工厂模式比工厂模式具有更高层次的抽象性.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以选择这种模式.直接进入示例. 示例描述:完成花园的规划,多种花园种类,每个里面多种植物 编写一个基类Garden,Garden就是抽象工厂.它定义了具体类中的方法,并返回一系列相关类中的某个类. public class Garden { protected Plant center, shade, border; protected bool showCenter, showS

易学设计模式看书笔记(4) - 抽象工厂模式

 本文内容来自书上,不懂设计模式,只求混个眼熟. 三.抽象工厂模式 1.动物管理系统的例子 public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } pu

设计模式(三):抽象工厂

一.定义 前面讲到的工厂方法.每个工厂对应着一类产品.抽象工厂就是工厂方法中不再是针对一种产品,而是多个不同类型的产品. 工厂方法和抽象方法的区别—手工的图,字有点丑. 二.实例 服务类型接口:也可以比作"系列A",具体的产品:WCF.BL public interface IService { } public class WCF : IService { public WCF() { Console.WriteLine("WCF服务."); } } public

设计模式(三): 抽象工厂模式

抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类.每个生成的工厂都能按照工厂模式提供对象. 介绍 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 主要解决:主要解决接口选择的问题. 何时使用:系统的产品有多于一个的产品族,而系统只消费其

一起来学设计模式-----创建型模式之抽象工厂

学习了简单工厂,工厂方法模式,那什么是抽象工厂呢?工厂方法模式是在超类(IFactory)中定义一个工厂的抽象接口(CreateOperation),然后由子类负责创建具体对象:而抽象工厂则是维护一个产品家族,由子类定义产品被产生的方法,客户根据超类的接口开发.目前简单的理解,抽象工厂更多的就是基于多种产品的抽象和对象的创建. 假设系统里有一个用户表,需求是插入和选择用户时根据用户的需求,可以保存在mysql 数据库或者Access数据库中,这时用工厂方法模式应该怎么样实现呢? 首先使用面向对象

.NET设计模式(3):抽象工厂模式(Abstract Factory)(转)

概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 模型图 逻辑模型: 物理模型: 生活中的例子 抽象工厂的目的是要提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类.这种

.NET设计模式(3):抽象工厂模式(Abstract Factory)

抽象工厂模式(Abstract Factory) ——探索设计模式系列之三 Terrylee,2005年12月12日 概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 模型图 逻辑模型:

设计模式总结篇系列:抽象工厂模式(Abstract Factory)

在上一篇的工厂方法模式中,通过一个公用的类对其他具有相同特性(实现相同接口或继承同一父类)的类的对象进行创建.随之带来的问题在于:当新定义了一个具有相同特性的类时,需要修改工厂类.这与设计模式中的开闭原则有些违背.因此,通过抽象工厂模式:创建多个工厂类而不是一个工厂类,一旦需要创建新的类对象,只需增加新的工厂类就可以了,不需要修改之前的代码.如此可以较好解决工厂方法模式中的问题. 常见经典写法如下(以发送邮件和短信为例): 1. 定义邮件类和短信类具有的共同接口: 与工厂方法模式中定义相同. 2