zoukankan      html  css  js  c++  java
  • [创建型] 简单工厂模式和工厂方法模式

    工厂方法模式(factory method)

    在工厂方法模式提出之前,有一个简单工厂模式。简单的介绍下简单工程模式,只提供一个工厂类,该工厂类处于对产品类进行实例化的中心位置,他处理每一个产品对象的创建细节。下面列举工厂创建不同品牌的电视机:

    /*
    * 存在一个TV抽象类,同时也存在多个不同品牌的电视机类,然后在TVFactory类中
    * 根据需求实例化不同的电视机类
    */

    #include <iostream>
    #include <string>
    using namespace std;
    class TV
    {
    public:
    TV() {}
    virtual ~TV() {}
    virtual void play() = 0;
    };

    class HaierTV : public TV
    {
    public:
    HaierTV() {}
    virtual ~HaierTV() {}
    virtual void play()
    {
    cout << "这是海尔电视机品牌" << endl;
    }
    };
    class SonyTV : public TV
    {
    public:
    SonyTV() {}
    virtual ~SonyTV() {}
    virtual void play()
    {
    cout << "这是sony电视机品牌" << endl;
    }
    };

    class Factory
    {
    public:
    Factory() {}
    ~Factory() {}
    TV * ProductTV(string str)
    {
    if(str == "Haier")
    {
    return new HaierTV();
    }
    else if(str == "Sony")
    {
    return new SonyTV();
    }
    else
    return NULL;
    }
    };
    void main()
    {
    string str;
    while(cin >> str)
    {
    Factory f;
    (f.ProductTV(str))->play();
    }

    }

    执行结果:

        输入: Haier

       输出:这是海尔电视机品牌

       输入:Sony

       输出:这是Sony电视机品牌

    从中可以看出,Factory类处理了创建电视机的所有细节。当有新品牌的电视机需要加入的时候,那么需要修改Factory类。这在软件工程中来说,违反了开闭原则。

    因此,有工厂方法模式的提出:

       解决方法:把工厂Factory也抽象出来,让电视机类的细节处理交予Factory类的子类完成。

    意图:
    定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

    适用性:
    当一个类不知道它所必须创建的对象的类的时候。
    当一个类希望由它的子类来指定它所创建的对象的时候。
    当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是
    代理者这一信息局部化的时候。

    代码如下:

    #include <iostream>
    using namespace std;
    // 工厂方法模式
    /*

    * 抽象产品和抽象工厂
    */
    class AbstructProduct
    {
    public:
    AbstructProduct() {}
    virtual ~AbstructProduct() {}
    virtual void product() = 0;
    };

    class AProduct : public AbstructProduct
    {
    public:
    AProduct() {}
    virtual~AProduct() {}
    virtual void product()
    {
    cout << "这里是A产品" << endl;
    }
    };

    class BProduct : public AbstructProduct
    {
    public:
    BProduct() {}
    virtual ~BProduct() {}
    virtual void product()
    {
    cout << "这里是B产品" << endl;
    }
    };

    class AbstructFactory
    {
    public:
    AbstructFactory() {}
    virtual ~AbstructFactory() {}
    virtual AbstructProduct * factory() = 0;
    };

    class AFactory : public AbstructFactory
    {
    public:
    AFactory() {}
    virtual ~AFactory() {}
    virtual AbstructProduct * factory()
    {
    return new AProduct();
    }
    };

    class BFactory : public AbstructFactory
    {
    public:
    BFactory() {}
    virtual ~BFactory() {}
    virtual AbstructProduct* factory()
    {
    return new BProduct();
    }
    };

    void main()
    {
    AbstructProduct *ap;
    AbstructFactory *af = new AFactory;
    ap = af->factory();
    ap->product();

    AbstructFactory *bf = new BFactory;
    ap = bf->factory();
    ap->product();
    }

    输出:

        这里是A产品

        这里是B产品


     

  • 相关阅读:
    多项式 ln exp
    动态点分治复习
    生成函数与多项式基础
    长链剖分学习笔记
    半平面交复习
    Maven的SSM框架配置文件:
    Linux(CentOs)之安装Redis及注意事项
    Scala:scala的一些简单操作命令
    Maven:如何在eclipse里新建一个Maven的java项目和web项目
    Maven:Eclipse上Maven的配置
  • 原文地址:https://www.cnblogs.com/xuxu8511/p/2403106.html
Copyright © 2011-2022 走看看