3.抽象工厂模式

1抽象工厂模式的核心内容是:

A:消费者分离,分别用不同的类实现(包含抽象类和实现类)

B:操作分离,分别用不同的类实现(包含抽象类和实现类)

C:使用工厂类使消费者类和操作类关联起来,有总线的功能。

2抽象工厂模式的作用:使用工厂将分别独立的消费者和实际的操作关联起来。

3抽象工厂模式具体描述

工厂模式:客户类和工厂类分开。

消费者任何时候需要某种产品,只需向工厂请求即可。

 

消费者无须修改就可以接纳新产品。缺点是当产品修改时,

 

工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

 

追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,

虽然口味有所不同,但不管你带MM去麦当劳或肯德基,

只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory。

 

消费者不固定,工厂者不固定,(工厂根据消费者动作)

 

实现消费者抽象基类,消费者派生类的实现,实例化就是消费者

 

操作的抽象基类,实现派生类各种操作,实例化的操作

 

工厂的抽象类,抽象类包含了两个抽象类的接口(消费者,操作)

抽象类实现了工厂类的抽象,实例化的派生类,实现工厂,

根据用户设置用户,根据操作设置操作

4.策略模式类图

5.代码:

#include<iostream>

#include
<string>

 

using
namespace
std;

 

//工厂模式:客户类和工厂类分开。

//消费者任何时候需要某种产品,只需向工厂请求即可。

 

//消费者无须修改就可以接纳新产品。缺点是当产品修改时,

 

//工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

//

//追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,

//虽然口味有所不同,但不管你带MM去麦当劳或肯德基,

//只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory。

 

//消费者不固定,工厂者不固定,(工厂根据消费者动作)

 

//实现消费者抽象基类,消费者派生类的实现,实例化就是消费者

 

//操作的抽象基类,实现派生类各种操作,实例化的操作

 

//工厂的抽象类,抽象类包含了两个抽象类的接口(消费者,操作)

//抽象类实现了工厂类的抽象,实例化的派生类,实现工厂,

//根据用户设置用户,根据操作设置操作

 

class
IUser

{

public:

   
//纯虚接口类,抽象类

   
virtual
void
getUser() = 0;

   
virtual
void
setUser() = 0;

};

 

//继承抽象实现sql数据库使用者的实例化

class
SqlUser :public
IUser

{

public:

   
void
getUser()

   
{

       
cout <<
"在sql中返回user"
<< endl;

   
}

   
void
setUser()

   
{

       
cout <<
"在sql中设置user"
<< endl;

   
}

};

 

//继承抽象实现access数据使用者的实例化

class
AccessUser :public
IUser

{

public:

   
void
getUser()

   
{

       
cout <<
"在Access中返回user"
<< endl;

   
}

   
void
setUser()

   
{

       
cout <<
"在Access中设置user"
<< endl;

   
}

};

 

//抽象类,提供接口

class
IDepartment

{

public:

   
virtual
void
getDepartment() = 0;

   
virtual
void
setDepartment() = 0;

};

 

//SQL操作的实现

class
SqlDepartment :public
IDepartment

{

public:

   
void
getDepartment()

   
{

       
cout <<
"在sql中返回Department"
<< endl;

   
}

   
void
setDepartment()

   
{

       
cout <<
"在sql中设置Department"
<< endl;

   
}

};

 

//access操作的实现

class
AccessDepartment :public
IDepartment

{

public:

   
void
getDepartment()

   
{

       
cout <<
"在Access中返回Department"
<< endl;

   
}

   
void
setDepartment()

   
{

       
cout <<
"在Access中设置Department"
<< endl;

   
}

};

 

//抽象工厂

class
IFactory

{

public:

   
virtual
IUser *createUser()
= 0;

   
virtual
IDepartment *createDepartment()
= 0;

};

 

//抽象工厂一个实现

class
SqlFactory :public
IFactory

{

public:

   
IUser *createUser()

   
{

       
return
new
SqlUser();

   
}

   
IDepartment *createDepartment()

   
{

       
return
new
SqlDepartment();

   
}

};

 

//抽象工厂一个实现

class
AccessFactory :public
IFactory

{

public:

   
IUser *createUser()

   
{

       
return
new
AccessUser();

   
}

   
IDepartment *createDepartment()

   
{

       
return
new
AccessDepartment();

   
}

};

 

//变相的实现了静态类

class
DataAccess

{

private:

   
static
string
db;

   
//string db="access";

public:

   
static
IUser *createUser()

   
{

       
if (db
== "access")

       
{

           
return
new
AccessUser();

       
}

       
else
if (db
== "sql")

       
{

           
return
new
SqlUser();

       
}

   
}

   
static
IDepartment *createDepartment()

   
{

       
if (db
== "access")

       
{

           
return
new
AccessDepartment();

       
}

       
else
if (db
== "sql")

       
{

           
return
new
SqlDepartment();

       
}

   
}

};

string
DataAccess::db
= "sql";

 

int
main()

{

   
//IFactory *factory=new SqlFactory();

   
IFactory *factory;//抽象工厂

   
IUser *user;//抽象消费者

   
IDepartment *department;//提供的操作

 

   
factory =
new
AccessFactory();//基类的指针指指向派生类的对象

   
user =
factory->createUser();//基类的指针指向派生类的对象

   
department =
factory->createDepartment();//基类的指针指向派生类的对象

 

   
user->getUser();

   
user->setUser();//访问acesss接口

 

   
department->getDepartment();

   
department->setDepartment();//接口

 

   
cout <<
"--------------------" <<
endl;

 

   
user =
DataAccess::createUser();

   
department =
DataAccess::createDepartment();

 

   
user->getUser();

   
user->setUser();

   
department->getDepartment();

   
department->setDepartment();

 

   
cin.get();

   
return 0;

}

运行结果如下:



时间: 2024-08-02 20:39:43

3.抽象工厂模式的相关文章

抽象工厂模式

又碰到好文章了,忍不住就想转,这种风格幽默清新的文章很有借鉴意义.转自:http://www.cnblogs.com/cbf4life/archive/2009/12/23/1630612.html 抽象工厂模式 9.1 女娲的失误      我们在上一章节讲了女娲造人的故事.人是造出来了,世界也热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,哇K!忘记给人类定义性别了,那怎么办?抹掉重来,于是人类经过一次大洗礼,所有的人种都消

C# 设计模式----抽象工厂模式

原文地址:C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性.但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,这是

php设计模式 — 抽象工厂模式

在什么情况下应当使用抽象工厂模式: 1.一个系统不应当依赖于产品类实例如何被创建.组合和表达的细节,这对于所有的形态的工厂模式都是重要的. 2.这个系统的产品有多余一个的产品族,而系统只消费其中某一个族的产品. 3.同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来. 4.系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现.     案例1: 还是以农场为例. 我们的农场分了多个产品线,一个是专门卖北方的蔬菜水果.一个专门卖南方的蔬菜水果.大家可

设计模式C#描述——抽象工厂模式

设计 设计模式C#描述--抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构.那么为了将消费这些产品对象的责任和创建这些产品对象的责任分开,可以引进抽象工厂模式.这样的话,消费产品的客户不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品. 采用抽象工厂模式设计出的系统类图如下. 从上图可以看到,抽象工厂模式设计到以下的角色: 抽象工厂

抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类. 全部代码: http://download.csdn.net/detail/u012515223/7403553 具体方法: 1. 提供一个抽象工厂(abstract factory)接口(interface)类, 不同的具体工厂(concrete factory)继承此类. 代码: /** * @time 2014年5月26日 */ package factory; /** * @author C.L.W

.NET抽象工厂模式微理解:教你在项目中实现抽象工厂

最近在学习MVC,对于MVC里面的一些项目上的东西都和抽象模式有关,今天就微说明一下个人对于抽象工厂模式的理解,以方便学习MVC及工厂模式相关的同事和博友们理解.不足之处,还请斧正! 首先简单阐述一些三层的关系,相信观看该文章的博友们对于三层设计早已经是烂熟于心了,我这边就简单说明一下: 用户界面表示层(Web) 业务逻辑层(BLL) 数据访问层(DAL) 1:数据数据访问层:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库

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

解决的问题: 在系统里a,b,c三个组件必须同时使用,但是a的同类 a1和a2这三种方法有共同特点但是是互斥的 ,b,b1,b2和c,c1,c2和a/a1/a2是一样的.就比如说创建在不同操作系统的视窗环境下都能够运行的系统时,Unix下面有 unixButton和 unixText,Win下面也有winButton和winText,unixButton和unixText必须在一个系统unix里面用,而 winButton和winText只能在Win下面用.但是winButton和unixBut

解读设计模式----抽象工厂模式(AbstractFactory Pattern)

一.模式描述 我的程序中有需要一系列的对象,比如我们要吃一碗米饭(Rice),要喝一杯咖啡(Coffee)......,要想利用他们,我们就必须在程序中根据用户要求,然后一个个调用 new 操作符来生成他们,这样客户程序就要知道相应的类的信息,生成的代码显然不够灵活.那么我们可以在代码中不利用具体的类,而只是说明我们需要什么,然后就能够得到我们想要的对象呢? 这当然是可以的,根据GOF在<设计模式>一书里介绍,要创建对象这样的工作应该是属于创建型模式完成的.熟悉各种设计模式意图的朋友就会很快得

C#设计模式之抽象工厂模式新解

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

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

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