创建型模式之 抽象工厂模式

介绍参见菜鸟教程

下面给出C++的一个例子

#include<iostream>
#include<memory>
using namespace std;

//shap接口
class shap {
public:
    virtual void draw() {};
};

//shap接口的实现类
class Rect : public shap
{
 public:
     void draw() { std::cout << "生成一个矩形" << std::endl; }
};
class Squ : public shap
{
public:
    void draw() { std::cout << "生成一个正方形" << std::endl; }
};
class Circ : public shap
{
public:
    void draw() { std::cout << "生成一个圆" << std::endl; }
};

//color接口
class color
{
public:
    virtual void fill() {};
};

//color 实现类
class Red : public color
{
public:
    void fill() { std::cout << "填充红色" << std::endl; }
};
class Green : public color
{
public:
    void fill() { std::cout << "填充绿色" << std::endl; }
};
class Blue : public color
{
public:
    void fill() { std::cout << "填充蓝色" << std::endl; }
};

//为 Color 和 Shape 对象创建抽象类来获取工厂
class AbstractFactory
{
public:
    virtual color* GetColor(string strColor) { return 0; };
    virtual shap*  GetShap(string strShap) {  return 0; };
};

//创建shap工厂
class ShapFactory : public AbstractFactory
{
public:
    ShapFactory() { cShap = NULL;  }
    ~ShapFactory() { ReleaseFactouy(); }

    shap* GetShap(string strShap)
    {
        if (strShap.compare("rectangle") == 0)
        {
            cShap = new Rect;
        }
        if (strShap.compare("square") == 0)
        {
            cShap = new Squ;
        }
        if (strShap.compare("circle") == 0)
        {
            cShap = new Circ;
        }
        return cShap;
    }
    void ReleaseFactouy()
    {
        if (cShap != NULL)
        {
            delete cShap;
        }
    }
private:
    shap * cShap;
};

//创建色彩工厂
class ColorFactory : public AbstractFactory
{
public:
    ColorFactory() { cColor = NULL; }
    ~ColorFactory() { ReleaseFactouy(); }

    color* GetColor(string strColor)
    {
        if (strColor.compare("red") == 0)
        {
            cColor = new Red;
        }
        if (strColor.compare("green") == 0)
        {
            cColor = new Green;
        }
        if (strColor.compare("blue") == 0)
        {
            cColor = new Blue;
        }
        return cColor;
    }
    void ReleaseFactouy()
    {
        if (cColor != NULL)
        {
            delete cColor;
        }
    }
private:
    color * cColor;
};

//创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂
class FactroyProduce
{
private:
    FactroyProduce() {};
    ~FactroyProduce() {};
    int i;
public:
    static AbstractFactory* GetFactory(string strFact)
    {
        if (strFact.compare("shap") == 0 )
        {
            cout << "新的mew1" << endl;
            return new ShapFactory;
        }
        else if (strFact.compare("color") == 0)
        {
            cout << "新的mew2" << endl;
            return new ColorFactory;
        }
        else
        {
            return NULL;
        }

    }
};
int main()
{
    shared_ptr<AbstractFactory> AbsFact(FactroyProduce::GetFactory("shap"));
    shap* shap1 = AbsFact->GetShap("rectangle");
    shap1->draw();        //生成一个矩形
    //...
    shared_ptr<AbstractFactory> AbsFact2(FactroyProduce::GetFactory("color"));
    color* color1 = AbsFact2->GetColor("red");
    color1->fill();        //生成红色
    //...
    return 0;
}

原文地址:https://www.cnblogs.com/gardenofhu/p/8488118.html

时间: 2024-10-31 08:46:28

创建型模式之 抽象工厂模式的相关文章

设计模式系列一创建型之(抽象工厂模式)

1.抽象工厂简介 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作. 如何应对这种变化? 如何绕过常规的对象的创建方法(new)? 如何来避免客户程序和这种“多系列具体对象创建工作”的紧耦合? 然而抽象工厂便可以很好地解决这个问题! 2.意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 3.适用性 一个系统要独立与它的产品创建.组合和表示时 一个系统要由多个产品系列中的一个来配置时 当你要强调一系列相关的产

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

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

java设计模式 -------- 创建模式 之 抽象工厂模式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂方法模式和抽象工厂模式不好区分清楚: 工厂方法模式特点: 1. 一个抽象产品类,可以派生出多个具体产品类. 2. 一个抽象工厂类,可以派生出多个具体工厂类. 3. 每个具体工厂类只能创建一个具体产品类的实例. 抽象工厂模式特点: 1. 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类. 2. 一个抽象工厂类,可以派生出多个具体工厂类. 3. 每个具体工厂类可以创建多个

简单工厂模式,工厂方法模式,抽象工厂模式

简单工厂模式.抽象工厂模式.工厂方法模式,这三种工厂模式都属于设计模式中的创建型模式,它们在形式和特点上也多少有些相似,其最终目的都是帮我们将对象的实例化部分取出来,进而优化系统架构,增强系统的扩展性,也就是说更好的体现开放封闭原则. 简单工厂模式: 概念: 简单工厂模式是类的创建模式,又叫做静态工厂方法模式,是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例,涉及到工厂角色.抽象产品角色以及具体产品角色. 结构图: 分析: 一: 简单工厂类是整个模式的关键所在,包含了必要的逻辑判断,根据

人人都能看懂的工厂方法模式和抽象工厂模式的区别

设计模式中的工厂方法模式和抽象工厂模式一直不知不觉地使用在程序设计中,但是就是经常只有实践没有进行理论指导,所以感觉有一点半路子出家而没有系统学习过的不踏实的感觉.现在总结了一下之前项目中使用过的抽象工厂模式,加强对创建型模式中工厂模式的理解. 先举个栗子感性的理解工厂方法模式和抽象工厂模式这两者的区别. 有一个富商,在深圳开了三个手机厂,分别代工苹果手机,三星手机,华为手机.富商经常视察这3个厂,在苹果手机厂就说"大家要做好苹果手机",在三星厂就说"大家要做好三星手机&qu

简单工厂模式、工厂方法模式和抽象工厂模式-设计模式学习

1.简单工厂模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象. 抽象产品(Product)角色 简单工厂模式所创建的所有

PHP简单工厂模式、工厂方法模式和抽象工厂模式比较

PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动更改. 根据抽象程度不同,PHP工厂模式分为:简单工厂模式.工厂方法模式和抽象工厂模式 简单工厂模式: /******代码在原文还是git上都有osgit地址 https://git.oschina.net/mjw/pattern.git  *******/ /** *简单工厂模式与工厂方法模式比较

工厂方法模式And抽象工厂模式

一.工厂方法模式 简单工厂模式的缺陷就是类的创建太过于依赖工厂,一旦需要进行程序扩展,就必须修改工厂类的代码 这违背了背包原则. 而工厂方法模式针对这一问题进行了改进. public interface Sender { public void send(); } public interface producer { public Sender produce(); } public class MailFactory implements producer{ public Sender pr

工厂模式和抽象工厂模式

工厂模式: 定义一个用于创建对象的接口,让他的子类决定实例化哪个类.使类的实例化延迟到子类. 1.普通的工厂模式: public class GoodProduct implements Product { private String prodInfo = "Iam the good prod"; public String getProductInfo() { // TODO Auto-generated method stub return this.prodInfo; } pu

工厂模式之抽象工厂模式

图显示有问题.可直接看: 点击打开链接 场景问题 举个生活中常见的样例--组装电脑,我们在组装电脑的时候.通常须要选择一系列的配件,比方CPU.硬盘.内存.主板.电源.机箱等. 为讨论使用简单点,仅仅考虑选择CPU和主板的问题. 其实.在选择CPU的时候.面临一系列的问题,比方品牌.型号.针脚数目.主频等问题.仅仅有把这些问题都确定下来,才干确定详细的CPU. 相同,在选择主板的时候.也有一系列问题.比方品牌.芯片组.集成芯片.总线频率等问题,也仅仅有这些都确定了,才干确定详细的主板. 选择不同