`

[创建型模式] head first 设计模式之工厂模式(Factory)

 
阅读更多
1 概述
  工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。工厂模式有以下几种形态:
  a) 简单工厂(Simple Factory)模式
  专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
  注意:简单工厂模式并不包含在23种模式之内。



  b) 工厂方法(Factory Method)模式,又称多形性工厂(Polymorphic Factory)模式
  将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定。通过继承来实现的。


  c) 抽象工厂(Abstract Factory)模式,又称工具箱(Kit或Toolkit)模式
  提供一个共同的接口来创建相互关联的多个对象。通过组合来实现的,但是抽象工厂中创建产品的方法通常是以“工厂方法”来实现的



GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。

2 说明
  工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样,客户程序中关于超类的代码就和子类对象创建代码解耦了。
  工厂模式定义:实例化对象,用工厂方法代替new操作。




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

针对的是一个产品等级结构                     针对的是面向多个产品等级结构
一个抽象产品类                                      多个抽象产品类
可以派生出多个具体产品类                      每个抽象产品类可以派生出多个具体产品类
一个抽象工厂类,可以派生出多个具体工厂类      一个抽象工厂类,可以派生出多个具体工厂类
每个具体工厂类只能创建一个具体产品类的实例      每个具体工厂类可以创建多个具体产品类的实例

3小结
★工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。
★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。
★工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。


4 区别
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)  
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)


简单工厂代码示例
class Light
{
public:
    virtual void TurnOn() = 0;
    virtual void TurnOff() = 0;
};

class BulbLight : public Light
{
public:
    virtual void TurnOn()
    {
        cout << "Bulb Light is Turned on\n";
    }

    virtual void TurnOff()
    {
        cout << "Bulb Light is Turned off\n";
    }
};

class TubeLight : public Light
{
public:
    virtual void TurnOn()
    {
        cout << "Tube Light is Turned on\n";
    }

    virtual void TurnOff()
    {
        cout << "Tube Light is Turned off\n";
    }
};

typedef enum EM_LightType
{
    LightType_Bulb,
    LightType_Tube,
}LightType;

class LightSimpleFactory
{
public:
    Light* Create(LightType emLightType)
    {
        if(LightType_Bulb == emLightType)
        {
            return new BulbLight();
        }
        else if(LightType_Tube == emLightType)
        {
            return new TubeLight();
        }
        else
        {
            return NULL;
        }
    }
};

class LightSimpleFactoryTest
{
public:
    void run()
    {
        LightSimpleFactory* pFactory = new LightSimpleFactory();

        Light* pLight = pFactory->Create(LightType_Bulb);
        pLight->TurnOn();
        pLight->TurnOff();
        delete pLight;

        cout <<"-----------------\n";

        pLight = pFactory->Create(LightType_Tube);
        pLight->TurnOn();
        pLight->TurnOff();
        delete pLight;

        delete pFactory;
    }
};


工厂方法示例



#ifndef   FACTORY_H
#define   FACTORY_H

#include <iostream>
#include <string>
#include <list>
#include <cassert>
using namespace std;

//工厂模式
namespace Factory
{
//const definitions
////////////////////////////////////////////////////////////////////////// 
typedef list<string>  ToppingList;

//////////////////////////////////////////////////////////////////////////
class Pizza
{
public:
    const char* getName()
    {
        return m_Name.c_str();
    }

    void prepare()
    {
//         class PizzaIngredientFactory
//         {
//         public:
//             Dough* creatDough() { return new Dough(); }
//             Sauce* creatSauce() { return new Sauce(); }
//         };
//         PizzaIngredientFactory ingredientFactory;
//         
//         m_Dough = ingredientFactory.creatDough();
//         m_Sauce = ingredientFactory.creatSauce();

        cout << "Preparing " << m_Name.c_str() << endl;
        cout << "Tossing dough..." << endl;
        cout << "Adding sauce..." << endl;
        cout << "Adding topping: " << endl;

        ToppingList::const_iterator iter = m_Toppings.begin();
        ToppingList::const_iterator end  = m_Toppings.end();
        for ( ; iter !=  end; ++iter)
        {
            cout << " " << (*iter).c_str();
        }
        cout << endl;
    }

    void bake()
    {
        cout << "Bake for 25 minutes at 350" << endl;
    }

    void cut()
    {
        cout << "Cutting the pizza into diagonal slices" << endl;
    }

    void box()
    {
        cout << "Place pizza in official PizzaStore box" << endl;
    }

protected:
    string m_Name;
    string m_Dough;
    string m_Sauce;
    ToppingList m_Toppings;
};

//////////////////////////////////////////////////////////////////////////
class NYStyleCheesePizza : public Pizza
{
public:
    NYStyleCheesePizza()
    {
        m_Name  = "NY Style Sauce and cheese Pizza";
        m_Dough = "Thin Crust Dough";
        m_Sauce = "Marinara Sauce";
        m_Toppings.push_back(string("Grated Reggiano Cheese"));
    }
};

//////////////////////////////////////////////////////////////////////////
class ChicagoStyleCheesePizza : public Pizza
{
public:
    ChicagoStyleCheesePizza()
    {
        m_Name  = "Chicago Style Deep Dish cheese Pizza";
        m_Dough = "Extra Thick Crust Dough";
        m_Sauce = "Plum Tomato Sauce";

        m_Toppings.push_back(string("Shredded Mozzarella Cheese"));
    }

    void cut()
    {
        cout << "Cutting the pizza into square slices" << endl;
    }
};

//////////////////////////////////////////////////////////////////////////
class PizzaStore
{
public:
    Pizza* orderPizza( string type)
    {
        if (m_Pizza != NULL)
        {
            delete m_Pizza;
            m_Pizza = NULL;
        }

        m_Pizza = createPizza(type);

        if ( m_Pizza != NULL)
        {
            m_Pizza->prepare();
            m_Pizza->bake();
            m_Pizza->cut();
            m_Pizza->box();
        }

        return m_Pizza;
    }

    PizzaStore()
        : m_Pizza(NULL)
    {}

    virtual ~PizzaStore()
    {
        if (m_Pizza!=NULL)
        {
            delete m_Pizza;
            m_Pizza = NULL;
        }
    }

protected:
    virtual Pizza* createPizza(string type) = 0;

protected:
    Pizza* m_Pizza;
};

//the factory
//////////////////////////////////////////////////////////////////////////
class NYStylePizzaStore : public PizzaStore
{
public:
    virtual Pizza* createPizza(string type)
    {
        if (type == "cheese")
        {
            m_Pizza = new NYStyleCheesePizza();
        }
        else if (type == "pepperoni")
        {
            //m_Pizza = new NYStylePepperoniPizza();
        }
        else if (type=="clam")
        {
            //m_Pizza = new NYStyleClamPizza();
        }
        else if (type=="veggie")
        {
            //m_Pizza = new NYStyleVeggiePizza();
        }
        else
        {
            m_Pizza = NULL;
        }

        return m_Pizza;
    }
};

//////////////////////////////////////////////////////////////////////////
class ChicgoStytlePizzaStore : public PizzaStore
{
public:
    virtual Pizza* createPizza(string type)
    {
        if (type == "cheese")
        {
            m_Pizza = new ChicagoStyleCheesePizza();
        }
        else if (type == "pepperoni")
        {
            //m_Pizza = new ChicagoStylePepperoniPizza();
        }
        else if (type=="clam")
        {
            //m_Pizza = new ChicagoStyleClamPizza();
        }
        else if (type=="veggie")
        {
            //m_Pizza = new ChicagoStyleVeggiePizza();
        }
        else
        {
            m_Pizza = NULL;
        }
        
        return m_Pizza;
    }
};

//////////////////////////////////////////////////////////////////////////
class PizzaTestDrive
{
public:
    void run()
    {
        PizzaStore* nyStore = new NYStylePizzaStore();
        PizzaStore* chicagoStore = new ChicgoStytlePizzaStore();

        Pizza* pizza = nyStore->orderPizza("cheese");
        assert(pizza != NULL);
        cout << "Ethan ordered a " << pizza->getName() << endl;

        pizza = chicagoStore->orderPizza("cheese");
        assert(pizza != NULL);
        cout << "Joel ordered a " << pizza->getName() << endl;

        delete nyStore;
        delete chicagoStore;
    }
};

}//namespace Factory

#endif



抽象工厂示例
#include <iostream>
using namespace std;

class AbstractProductA
{
public:
    virtual ~AbstractProductA(){}

protected:
    AbstractProductA(){}

private:
};

class AbstractProductB
{
public:
    virtual ~AbstractProductB(){}

protected:
    AbstractProductB(){}
};

class ProductA1 : public AbstractProductA
{
public:
	ProductA1()
    {
        cout<<"ProductA1..."<<endl;
    }
    ~ProductA1(){}
};

class ProductA2 : public AbstractProductA
{
public:
	ProductA2()
    {
        cout<<"ProductA2..."<<endl;
    }

    ~ProductA2(){}
};

class ProductB1 : public AbstractProductB
{
public:
	ProductB1()
    {
        cout<<"ProductB1..." << endl;
    }
    ~ProductB1(){}
};

class ProductB2 : public AbstractProductB
{
public:
	ProductB2()
    {
        cout<<"ProductB2..." << endl;
    }
    ~ProductB2(){}
};

//////////////////////////////////////////////////////////////////////////
class AbstractFactory
{
public:
    virtual ~AbstractFactory(){}
	virtual AbstractProductA *CreateProductA() = 0;
	virtual AbstractProductB *CreateProductB() = 0;

protected:
    AbstractFactory(){}

};

class ConcreteFactory1 : public AbstractFactory
{
public:
	ConcreteFactory1()
    {
    }

	~ConcreteFactory1()
    {
    }

	AbstractProductA* CreateProductA()
    {
        return new ProductA1();
    }

	AbstractProductB* CreateProductB()
    {
        return new ProductB1();
    }
};

class ConcreteFactory2 : public AbstractFactory
{
public:
    ConcreteFactory2(){}
    ~ConcreteFactory2(){}

	AbstractProductA *CreateProductA()
    {
        return new ProductA2();
    }

	AbstractProductB *CreateProductB()
    {
        return new ProductB2();
    }
};

//////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
	AbstractFactory *cf1 = new ConcreteFactory1();
	cf1->CreateProductA();
	cf1->CreateProductB();

	AbstractFactory *cf2 = new ConcreteFactory2();
	cf2->CreateProductA();
	cf2->CreateProductB();

	return 0;
}
分享到:
评论

相关推荐

    Head First 设计模式 (四) 工厂模式(factory pattern) C++实现

    工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当客户端请求创建一个产品对象时,它只需要一个具体工厂类的引用,而不需要知道如何构造这些对象的细节。这种模式的核心在于封装了...

    head first 设计模式 高清完整版 pdf

    创建型模式关注对象的创建,如单例模式(Singleton)、工厂模式(Factory Method)和建造者模式(Builder)等,它们旨在控制实例化过程,降低类之间的耦合度。结构型模式关注如何组合现有的组件以形成更复杂的结构,...

    Head First设计模式和HeadFirst in java 源码以及23种设计模式关系图

    总的来说,这个压缩包包含的资源可以帮助你深入理解设计模式,通过《HeadFirst设计模式》和《HeadFirst in Java》的源码,你可以学习到如何在实际项目中应用这些模式。而UML类图则提供了直观的视角,便于你把握设计...

    HeadFirst设计模式PPT

    《HeadFirst设计模式》是一本深受开发者欢迎的书籍,它以独特、易理解的方式介绍了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的最佳实践,它们为软件设计提供了可复用的...

    Head First Design Patterns 英文版 Head First设计模式

    其中,创建型模式如工厂方法(Factory Method)、抽象工厂(Abstract Factory)、单例(Singleton)和建造者(Builder)模式等,用于创建对象时提供更灵活和优雅的解决方案。结构型模式如适配器(Adapter)、外观...

    HeadFirst设计模式源代码

    创建型模式关注对象的创建,如单例模式(Singleton)、工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory)等,它们提供了一种在不指定具体对象的情况下创建对象的方法。结构型模式关注如何组合对象...

    head first 设计模式 PDF电子书下载

    创建型模式关注于对象的创建,如单例模式(Singleton)、工厂模式(Factory Method)和抽象工厂模式(Abstract Factory)。结构型模式涉及如何组合类和对象以获得更大的结构,如适配器模式(Adapter)、装饰器模式...

    HeadFirst设计模式英文版

    《Head First 设计模式》的英文版是一本面向初学者的设计模式入门书籍,它以幽默风趣的文风,深入浅出地介绍了软件设计中经常使用的设计模式。设计模式是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的...

    headfirst设计模式

    1. 创建型模式:如单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype)。这些模式关注于对象的创建,帮助我们在不指定具体类的情况下,创建和管理...

    HeadFirst设计模式JAVA版源码

    《HeadFirst设计模式JAVA版源码》是一份深入学习设计模式的重要资源,它基于流行的编程语言Java,旨在帮助开发者理解并应用设计模式于实际项目中。设计模式是软件工程中的重要概念,它代表了在特定场景下解决问题的...

    Head First设计模式官方原码

    1. **创建型模式**:包括单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。这些模式主要关注对象的创建过程,使得对象的...

    [中文]Head-First设计模式

    创建型模式关注对象的创建过程,如单例模式(Singleton)、工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。这些模式帮助我们控制对象的实例化过程...

    Head First设计模式 源代码

    2. **创建型模式**:包括单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype)模式。这些模式关注对象的创建过程,帮助我们隔离对象的创建细节,...

    Head.First设计模式_PDF

    第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton、Command、Adapter、Facade、Template Method、iterator、Composite、State、proxy。最后三章比较...

    Head First设计模式(含目录)

    创建型模式关注对象的创建,如单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)等,它们提供了创建对象的灵活方式,使得系统在运行时可以动态决定创建哪种类型的对象。...

    Head First 设计模式(中文版.pdf

    创建型模式关注对象的创建过程,如单例模式(Singleton)、工厂模式(Factory)和抽象工厂模式(Abstract Factory),它们旨在提供更灵活、可扩展的构造机制。结构型模式关注如何组合现有对象来形成更大的结构,例如...

Global site tag (gtag.js) - Google Analytics