`

抽象工厂(Abstract Factory)

阅读更多
抽象工厂模式:提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。这样客户就可以从具体的产品中被解耦.

要点:
1.抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中
2.抽象工厂创建相关的对象家族,而不需要依赖它们的具体类

关于简单工厂,工厂,抽象工厂的区别,从网上找到一个比较好的实例:
1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.
2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.
3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.
简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品.



Pizza.h
#ifndef PIZZA_H
#define PIZZA_H
#include"iostream"
#include"PizzaIngredientFactory.h"
using namespace std;
class Pizza{
public:
    explicit Pizza(PizzaIngredientFactory* pif){
        mPif = pif;
    }
    virtual void prepare(){
        cout << "prepare..." << endl;
    }
    virtual void bake(){
        cout << "bake..." << endl;
    }
    virtual void cut(){
        cout << "cut..." << endl;
    }
    virtual void box(){
        cout << "box..." << endl;
    }
private:
    PizzaIngredientFactory* mPif;
};

class CheesePizza:public Pizza{
public:
    explicit CheesePizza(PizzaIngredientFactory* pif):Pizza(pif),mPif(pif){
        mPif->createDough();
        mPif->createClam();
        cout << "this is a CheesePizza" << endl;
    }
private:
    PizzaIngredientFactory* mPif;
};

class VeggiePizza:public Pizza{
public:
    explicit VeggiePizza(PizzaIngredientFactory* pif):Pizza(pif),mPif(pif){
        mPif->createPepperoni();
        mPif->createClam();
        cout << "this is a CheesePizza" << endl;
    }
private:
    PizzaIngredientFactory* mPif;
};

class ClamPizza:public Pizza{
public:
    explicit ClamPizza(PizzaIngredientFactory* pif):Pizza(pif),mPif(pif){
        mPif->createDough();
        mPif->createVeggies();
        cout << "this is a CheesePizza" << endl;
    }
private:
    PizzaIngredientFactory* mPif;
};

class PepperonPizza:public Pizza{
public:
    explicit PepperonPizza(PizzaIngredientFactory* pif):Pizza(pif),mPif(pif){
        mPif->createPepperoni();
        mPif->createSauce();
        cout << "this is a CheesePizza" << endl;
    }
private:
    PizzaIngredientFactory* mPif;
};
#endif // PIZZA_H



PizzaStore.h
#ifndef PIZZASTORE_H
#define PIZZASTORE_H

#include"Pizza.h"

enum PizzaType{
    CHEESEPIZZA,
    VEGGIEPIZZA,
    CLAMPIZZA,
    PEPPERONIPIZZA
};

class PizzaStore{
public:
    explicit PizzaStore(){
    }
    void orderPizza(PizzaType pt){
        Pizza *pizza;
        pizza = createPizza(pt);
        pizza->prepare();
        pizza->bake();
        pizza->cut();
        pizza->box();
    }
    virtual Pizza* createPizza(PizzaType pt)=0;
};

class NYPizzaStore:public PizzaStore{
public:
    NYPizzaStore(){
        mPif = new NYPizzaIngredientFactory;
    }
    void orderPizza(PizzaType pt){
        Pizza *pizza;
        pizza = createPizza(pt);
        pizza->prepare();
        pizza->bake();
        pizza->cut();
        pizza->box();
    }
    Pizza* createPizza(PizzaType pt){
        switch(pt){
        case CHEESEPIZZA:
            return new CheesePizza(mPif);
            break;
        case VEGGIEPIZZA:
            return new VeggiePizza(mPif);
            break;
        case CLAMPIZZA:
            return new ClamPizza(mPif);
            break;
        case PEPPERONIPIZZA:
            return new PepperonPizza(mPif);
            break;
          default:
              return NULL;
              break;
        }
    }

private:
    PizzaIngredientFactory* mPif;
};

#endif // PIZZASTORE_H



PizzaIngredientFactory.h
#ifndef PIZZAINGREDIENTFACTORY_H
#define PIZZAINGREDIENTFACTORY_H
#include<iostream>
using namespace std;
//生面团
class Dough{};
//果酱
class Sauce{};
//蔬菜
class Veggies{};
//意大利辣味香肠
class Pepperoni{};
//蛤蜊
class Clam{};

//原料工厂
class PizzaIngredientFactory{
public:
    virtual void createDough()=0;
    virtual void createSauce()=0;
    virtual void createVeggies()=0;
    virtual void createPepperoni()=0;
    virtual void createClam()=0;
};

class NYPizzaIngredientFactory:public PizzaIngredientFactory{
public:
    void createDough(){
        cout << "create dough.." << endl;
    }
    void createSauce(){
        cout << "create sauce.." << endl;
    }
    void createVeggies(){
        cout << "create veggies.." << endl;
    }
    void createPepperoni(){
        cout << "create popperoni.." << endl;
    }
    void createClam(){
        cout << "create clam.." << endl;
    }
};

#endif // PIZZAINGREDIENTFACTORY_H


main.cpp
#include"PizzaStore.h"

int main(){
    PizzaStore *store = new NYPizzaStore();
    store->orderPizza(CHEESEPIZZA);
}

create dough..
create clam..
this is a CheesePizza
prepare...
bake...
cut...
box...





另一份代码:



SimpleFactory.h
#ifndef SIMPLEFACTORY_H
#define SIMPLEFACTORY_H

class Fruit
{

};

class Apple:public Fruit
{

};

class Pear:public Fruit
{

};

class Orange:public Fruit
{

};

enum FRUIT_TYPE
{
    APPLE,
    PEAR,
    ORANGE
};

class Land
{
public:
    Land()
    {
        mApple = new Apple;
        mPear = new Pear;
        mOrange = new Orange;
    }

    ~Land(){}

    Fruit* create(int fruitType)
    {
        switch(fruitType)
        {
        case APPLE:
            return mApple;
        case PEAR:
            return mPear;
        case ORANGE:
            return mOrange;
        default:
            return 0;
        }
    }
private:
    Apple* mApple;

    Pear* mPear;

    Orange* mOrange;
};

#endif // SIMPLEFACTORY_H



FactoryMethod.h
#ifndef FACTORYMETHOD_H
#define FACTORYMETHOD_H

namespace FactoryMethod
{

class Fruit{};

class Apple:public Fruit{};

class Apple1:public Apple{};

class Apple2:public Apple{};

class Apple3:public Apple{};

class Land
{
public:
    virtual Fruit* create()=0;
};

class AppleLand:public Land
{
public:
    AppleLand()
    {
        mApple = new Apple;
    }

    ~AppleLand(){}

    Fruit* create()
    {
        return mApple;
    }
private:
    Apple* mApple;
};

}//end of namespace FactoryMethod

#endif // FACTORYMETHOD_H



AbstractFactory.h
#ifndef ABSTRACTFACTORY_H
#define ABSTRACTFACTORY_H

namespace AbstractFactory
{

class Fruit{};

class Apple:public Fruit{};

class Apple1:public Apple{};

class Apple2:public Apple{};

class Apple3:public Apple{};

class Land
{
public:
    virtual Fruit* createType1()=0;
    virtual Fruit* createType2()=0;
    virtual Fruit* createType3()=0;
};

class Apple1Land:public Land
{
public:
    Apple1Land()
    {
        mApple1 = new Apple1;
        mApple2 = new Apple2;
        mApple3 = new Apple3;
    }

    ~Apple1Land(){}

    Fruit* createType1(){
        return mApple1;
    }
    Fruit* createType2(){
        return mApple2;
    }
    Fruit* createType3(){
        return mApple3;
    }
private:
    Apple* mApple1;

    Apple* mApple2;

    Apple* mApple3;
};

}//end of namespace AbstractFactory

#endif // ABSTRACTFACTORY_H



main.cpp
#include "SimpleFactory.h"
#include "FactoryMethod.h"
#include "AbstractFactory.h"

int main()
{
    Land* land = new Land;
    land->create(APPLE);

    FactoryMethod::Land* appleLand = new FactoryMethod::AppleLand;
    appleLand->create();

    AbstractFactory::Land* apple1Land = new AbstractFactory::Apple1Land;
    apple1Land->createType1();
}

  • 大小: 87 KB
  • 大小: 29.2 KB
分享到:
评论

相关推荐

    抽象工厂AbstractFactory

    抽象工厂(Abstract Factory)模式是一种创建型设计模式,它提供了一种创建对象的接口,但允许子类决定实例化哪一个类。这种模式是基于对象的抽象,而不是具体的类,因此,它允许创建一系列相关的对象,而无需指定...

    C# 抽象工厂 AbstractFactory.rar

    这个压缩包“C# 抽象工厂 AbstractFactory.rar”可能包含了一个关于如何在C#中实现抽象工厂模式的实例或教程。 抽象工厂模式是一种创建型设计模式,它提供了一种创建对象族的方式,而无需指定具体类。在C#中,这种...

    走进设计模式之抽象工厂(Abstract Factory)

    1. **模式结构**:抽象工厂模式通常包括抽象工厂接口(AbstractFactory),具体工厂类(ConcreteFactory),抽象产品接口(Product)以及具体产品类(ConcreteProduct)。抽象工厂定义了创建产品的方法,而具体工厂...

    Abstract_Factory抽象工厂

    Abstract_Factory抽象工厂Abstract_Factory抽象工厂Abstract_Factory抽象工厂Abstract_Factory抽象工厂

    抽象工厂模式abstractFactory

    抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建对象集合的接口,而无需指定具体的产品类型。这种模式适用于当系统需要在不同平台或环境中创建一组相关或相互依赖的对象时,而这些...

    工厂方法和抽象工厂——Factory Method & Abstract Factory

    在软件设计模式中,工厂方法(Factory Method)和抽象工厂(Abstract Factory)是两种非常重要的创建型模式。它们主要用于解决对象实例化的问题,提供了一种封装对象创建过程的方法,使得代码更加灵活,易于扩展和...

    创建型模式之抽象工厂模式(Abstract Factory Pattern)

    1. 抽象工厂(Abstract Factory):这是模式的核心,它是一个接口或抽象类,定义了一系列创建对象的方法,但并不直接实例化具体的对象。这些方法用于创建一系列相关或相互依赖的对象。 2. 具体工厂(Concrete ...

    AbstractFactory 抽象工厂

    抽象工厂(Abstract Factory)模式是设计模式中的一种创建型模式,它提供了一种...在阅读提供的博客文章《AbstractFactory 抽象工厂》和研究压缩包中的相关文件时,你可以深入学习到更多关于这个模式的实践和应用场景。

    设计模式C++学习之抽象工厂模式(AbstractFactory)

    在这个例子中,`AbstractProductA`和`AbstractProductB`是抽象产品,`ConcreteProductA1/A2`和`ConcreteProductB1/B2`是具体产品,`AbstractFactory`是抽象工厂,`ConcreteFactory1/2`是具体工厂。客户端代码通过...

    设计模式之-抽象工厂-AbstractFactory

    抽象工厂(Abstract Factory)设计模式是软件工程中一种重要的创建型设计模式,它提供了一种创建对象组的方式,这些对象属于同一族系并且彼此相关。这个模式的主要目标是定义一个接口,用于创建一族相关或相互依赖的...

    通过python实现抽象工厂模式(Abstract Factory Pattern).rar

    抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建一系列相关或相互依赖对象的接口。这个模式使得客户端代码与具体产品的实现解耦,从而提高了系统的灵活性和...

    创建型-抽象工厂模式(Abstract Factory)

    1. 抽象工厂(Abstract Factory):这是模式的核心,定义了一组创建对象的接口,客户端通过这个接口请求创建所需的产品。这个接口不直接创建产品,而是将产品创建的职责委托给具体工厂。 2. 具体工厂(Concrete ...

    抽象工厂模式(Abstract Factory Pattern)

    ### 抽象工厂模式(Abstract Factory Pattern) #### 引入 在探讨抽象工厂模式之前,我们先回顾一下之前介绍过的简单工厂模式与工厂方法模式。这两种模式主要关注于解决对象创建过程中“new”操作的问题,使得创建...

    抽象工厂模式(Abstract factory)

    1. **抽象工厂接口(Abstract Factory)**:定义了一系列产品的创建方法,例如`NWFactory`可能是这个抽象工厂的实现,它包含了创建人和动物的方法。 2. **具体工厂类(Concrete Factory)**:实现了抽象工厂接口,...

    抽象工厂模式(AbstractFactory)源代码

    设计模式抽象工厂模式(AbstractFactory)源代码

    通过C#实现抽象工厂模式(Abstract Factory Pattern).rar

    在C#中实现抽象工厂模式(Abstract Factory Pattern)涉及定义一个抽象工厂接口,该接口声明用于创建抽象产品的方法。然后,为每个具体产品族实现一个具体工厂,这些工厂提供创建具体产品的实现。最后,客户端代码...

    AbstractFactory.rar抽象工厂

    在“AbstractFactory.rar”这个压缩包中,我们可以预想包含了一个简单的示例,用来演示抽象工厂模式的基本概念和应用。 抽象工厂模式的核心在于“工厂”,在软件工程中,工厂是负责创建对象的类或接口。在这个具体...

    C#设计模式之抽象工厂(abstract factory)模式示例源代码

    ### C#设计模式之抽象工厂(Abstract Factory)模式详解 #### 概述 抽象工厂模式(Abstract Factory Pattern)是创建型设计模式的一种,它提供了一个接口用于创建一系列相关的或相互依赖的对象,而无需指定它们具体的...

    抽象工厂模式(AbstractFactory)

    在给定的压缩包文件中,"AbstractFactory"可能包含了一些示例代码或者实现,用来解释抽象工厂模式的具体应用。这些代码可能包括抽象工厂接口、具体工厂类以及抽象产品和具体产品的定义。通过查看这些代码,我们可以...

    抽象工厂(abstract factory)

    生产餐具和相应食物的工厂,有两个车间,其中一个车间用以生产餐具,一个车间用以生产相应的食物。 每个具体工厂生产出来的具体产品根据不同工厂的不同各不相同,但是客户使用产品的方法是一致的。比如客户在得到...

Global site tag (gtag.js) - Google Analytics