设计模式(三)抽象工厂模式(Abstract Factory Pattern)

Key:抽象工厂模式可以产生新的系列产品,并控制产品的生产过程。

这里有必要和工厂方法这个设计模式做一些比较。工厂方法和抽象工厂并不是谁更高级,虽然听起来抽象工厂比工厂方法高级点。它们各有长处,各有短处。工厂方法在增加产品种类上比较方便,增加一个具体工厂和一个具体产品即可。而在产生系列产品上比较不方便,可能会造成类的爆炸。而抽象工厂在产生系列产品上比较方便,但是如果增加产品的种类,不得不去在修改抽象工厂类。像空间主页或皮肤,一次替换多个元素,就很像抽象工厂模型。其实和工厂模式相比,就是在工厂里面多了几个抽象的产品生产方法,而工厂方法模型里面只有一个抽象的产品生产方法。

例如为了产生交通工具和食品两个产品,而这两个产品有一定关系,需要结合在一起使用的时候,可以利用抽象工厂设计模式。

 

 

 

代码如下:

#include<iostream>
using namespace std;

class Food
{
        public:
                virtual void showName() = 0;
};

class Vehicle
{
        public:
                virtual void run() = 0;
};

class AbstractFactory
{
        public:
                virtual Food *createFood() = 0;   //这里注意Food类一定要声明在前面,否则编译器找不到Food类型
                virtual Vehicle *createVehicle() = 0;
};

class Apple:public Food
{
        public:
                void showName()
                {cout<<"An apple!"<<endl;};
};

class Orange:public Food
{
        public:
                void showName()
                {cout<<"An orange"<<endl;};
};

class Car:public Vehicle
{
        public:
                void run()
                {cout<<"car run!"<<endl;};
};
class Plane:public Vehicle
{
        public:
                void run()
                {cout<<"plane run!"<<endl;};
};

class MyFactory1:public AbstractFactory
{
        public:
                Food *createFood()
                {return new Apple();};
                Vehicle *createVehicle()
                {return new Car();};
};

class MyFactory2:public AbstractFactory
{
        public:
                Food *createFood()
                {return new Orange();};
                Vehicle *createVehicle()
                {return new Plane();};
};

int main()
{
        //AbstractFactory *factory = new MyFactory1(); //只需要替换一个工厂,就可以替换工厂产生的系列的产品
        AbstractFactory *factory = new MyFactory2();
        Food *food = factory->createFood();
        food->showName();
        Vehicle *vehicle = factory->createVehicle();
        vehicle->run();
        return 0;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
此资源出自下面的作者,我只是转载,非常实用的设计方法,如果您想成位出色的设计师,那就再复习复习吧!如果您想成为软件设计师,通过学习,您将会站另一个高度看待软件设计. 原始地址:http://terrylee.cnblogs.com/archive/2005/12/13/295965.html ========================================= 抽象工厂模式Abstract Factory) ——探索设计模式系列之 Terrylee,2005年12月12日 概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 模型图 逻辑模型: 物理模型: 生活中的例子 抽象工厂的目的是要提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类。这种模式可以汽车制造厂所使用的金属冲压设备中找到。这种冲压设备可以制造汽车车身部件。同样的机械用于冲压不同的车型的右边车门、左边车门、右前挡泥板、左前挡泥板和引擎罩等等。通过使用转轮来改变冲压盘,这个机械产生的具体类可以在分钟内改变。 抽象工厂之新解 虚拟案例 中国企业需要一项简单的财务计算:每月月底,财务人员要计算员工的工资。 员工的工资 = (基本工资 + 奖金 - 个人所得税)。这是一个放之四海皆准的运算法则。 为了简化系统,我们假设员工基本工资总是4000美金。 中国企业奖金和个人所得税的计算规则是: 奖金 = 基本工资(4000) * 10% 个人所得税 = (基本工资 + 奖金) * 40% 我们现在要为此构建一个软件系统(代号叫Softo),满足中国企业的需求。 案例分析 奖金(Bonus)、个人所得税(Tax)的计算是Softo系统的业务规则(Service)。 工资的计算(Calculator)则调用业务规则(Service)来计算员工的实际工资。 工资的计算作为业务规则的前端(或者客户端Client)将提供给最终使用该系统的用户(财务人员)使用。 针对中国企业为系统建模 根据上面的分析,为Softo系统建模如下: 则业务规则Service类的代码如下: ......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值