设计模式之十一:抽象工厂模式(Abstract Factory)

抽象工厂模式:

提供了一个创建一系列相关的或相互依赖的对象的接口而不需要具体指定它们的类型。

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

UML类图:

主要包括:

  1. AbstractFactory(ContinentFactory):抽象的工厂类,为具体的工厂类声明了一系列的接口。
  2. ConcreteFactory(AfricaFactory,AmericaFactory):具体的工厂类,实现了创建具体对象的接口。
  3. AbstractProduct(Herbivore,Carnivore):抽象的产品类。
  4. Product(Wildebeest,Lion,Bison,Wolf):具体的产品类
  5. Client(AnimalWorld):使用抽象的工厂和抽象的产品类来创建对象。

基本的抽象工厂模式C++代码如下:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>

class AbstractProductA
{
    public:
            virtual void show()=0;
};

class  ProductA1:public AbstractProductA
{
    public:
            void show()
            {
                std::cout<<"ProductA1::show()"<<std::endl;
            }

};

class  ProductA2:public AbstractProductA
{
    public:
            void show()
            {
                std::cout<<"ProductA2::show()"<<std::endl;
            }
};

class AbstractProductB
{
    public :
            virtual void display()=0;
};

class ProductB1:public AbstractProductB
{
    public:
            void display()
            {
                std::cout<<"ProductB1::display()"<<std::endl;
            }
};

class ProductB2:public AbstractProductB
{
    public:
            void display()
            {
                std::cout<<"ProductB2::display()"<<std::endl;
            }
};

class AbstractFactory
{
        public:
                virtual AbstractProductA* createProductA()=0;
                virtual AbstractProductB* createProductB()=0;

};

class ConcreteFactory1:public AbstractFactory
{
        public:
                AbstractProductA *createProductA()
                {
                    return new ProductA1();
                }
                AbstractProductB *createProductB()
                {
                    return new ProductB1();
                }
};

class ConcreteFactory2:public AbstractFactory
{
        public:
                AbstractProductA *createProductA()
                {
                    return new ProductA2();
                }
                AbstractProductB *createProductB()
                {
                    return new ProductB2();
                }
};

class Client
{
    public:

    Client()
    {
    }
    Client(AbstractFactory *af)
    {
        abstractFactory=af;
    }
    AbstractProductA * getProductA()
    {
        return abstractProductA;
    }
    AbstractProductB* getProductB()
    {
        return abstractProductB;
    }

    void run()
    {
        abstractProductA=abstractFactory->createProductA();
        abstractProductB=abstractFactory->createProductB();
    }
    ~Client()
    {
        if(!abstractProductA)
                delete abstractProductA;
        if(!abstractProductB)
                delete abstractProductB;
    }

    private:
    AbstractFactory *abstractFactory;
    AbstractProductA * abstractProductA;
    AbstractProductB * abstractProductB;
};

int main()
{
    std::cout<<"抽象工厂模式测试"<<std::endl;
    AbstractFactory *af=new ConcreteFactory1();
    Client* client=new Client(af);

    client->run();
    client->getProductA()->show();
    client->getProductB()->display();

    delete af;
    delete client;
    return 0;
}

执行结果:

再看一个具体的例子:

  1. AbstractFactor为ContinentFactory,即大陆工厂。
  2. ConcreteFactory为AfricaFactory(非洲大陆),AmericaFacoty(美洲大陆)
  3. AbstractProduct包括Herbivore(食草动物),Carnivore(食肉动物)。
  4. Product包括Wildebeest(羚羊),Lison(狮子),Bison(美洲野牛),Wolf(美洲狐狸)。
  5. Client为AnimalWorld。

大陆上有食肉动物和食草动物,但是不同的大陆比如说非洲大陆的食肉动物和食草动物和美洲大陆的食肉动物和食草动物是不同的。抽象工厂工厂模式和工厂方法模式的不同点就在于抽象工厂模式有两处变化的地方,除了工厂类可以变化外,抽象的产品类有多个而不是一个。

UML图如下:

C++代码实现如下:

#include <stdlib.h>
#include <stdio.h>
#include <iostream>

//食草动物
class Herbivore
{
        public:
                virtual void drink()=0;
};

//羚羊的一种,产于非洲
class Wildebeest:public Herbivore
{
        public:
                void drink()
                {
                    std::cout<<"wildbeest drink"<<std::endl;
                }
};

//美洲野牛
class Bison:public Herbivore
{
        public:
                void drink()
                {
                    std::cout<<"bison drink"<<std::endl;
                }
};

//食肉动物
class Carnivore
{
    public:
            virtual void eat()=0;
};

//非洲狮子
class Lion:public Carnivore
{
    public:
            void eat()
            {
                std::cout<<"lion eat"<<std::endl;
            }
};

//狼
class Wolf:public Carnivore
{
        public:
            void eat()
            {
                std::cout<<"wolf eat"<<std::endl;
            }
};

//大陆工厂
class ContinentFactory
{
        public:
                virtual Herbivore * createHerbivore()=0;
                virtual Carnivore * createCarnivore()=0;

};

class AfricaFactory :public ContinentFactory
{
        public:
                virtual Herbivore * createHerbivore()
                {
                    return new Wildebeest();
                }
                virtual Carnivore * createCarnivore()
                {
                    return new Lion();
                }

};

class AmericaFactory :public ContinentFactory
{
        public:
                virtual Herbivore * createHerbivore()
                {
                    return new Bison();
                }
                virtual Carnivore * createCarnivore()
                {
                    return new Wolf();
                }

};

class AnimalWorld
{
        public:
                AnimalWorld()
                {

                }
                AnimalWorld(ContinentFactory *cf)
                {
                        herbivore=cf->createHerbivore();
                        carnivore=cf->createCarnivore();

                }
                void action()
                {
                        herbivore->drink();
                        carnivore->eat();
                }
                ~AnimalWorld()
                {
                        if(!herbivore)
                                delete herbivore;
                        if(!carnivore)
                                delete carnivore;
                }
        private:
                Herbivore * herbivore;
                Carnivore * carnivore;

};

int main()
{
    std::cout<<"抽象工厂模式具体的例子"<<std::endl;
    ContinentFactory * cf=new AmericaFactory;
    AnimalWorld *an=new AnimalWorld(cf);
    an->action();
    delete cf;
    delete an;
    return 0;
}

执行结果:

时间: 2024-12-17 03:54:49

设计模式之十一:抽象工厂模式(Abstract Factory)的相关文章

Android设计模式——抽象工厂模式(Abstract Factory)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

php设计模式——抽象工厂模式(Abstract Factory)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 <?php 2 /* 3 * php设计模式——抽象工厂模式(Abstract Factory) 4 */ 5 6 7 /* 8 * I

设计模式 - 抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 参考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类. 全部代码: http://download.csdn.net/de

设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 參考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不须要明白指定详细类. 所有代码: http://download.csdn.net/

【设计模式】 抽象工厂模式 Abstract Factory Pattern

简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式相对于简单工厂和工厂方法模式来着更具抽象性. 一.抽象工厂模式演绎 我们先来看一个简单的需求: 甲方要开发一套办公自动化软件,其中有一个非常重要的功能就是要能够导入Word 文档和Excel 文档. 开发人员拿到需求后就开始编码了,  很快代码写完了: public class ImportTool

二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Message有一个Insert()方法,该方法的参数是MessageModel. AbstractMessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Abstract

抽象工厂模式(Abstract Factory)C#实例

抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 本实例描述了抽象工厂模式的一个使用场景.在动物世界弱肉强食,食肉动物会吃掉食草动物.这是动物世界的规律,因此在动物世界类中有Runfoodchain(运行食物链)方法.在动物世界里总是有食肉动物和食草动物这两个抽象成员.它们之所以是抽象成员是因为他们不是具体的一种动物.而食草动物与食肉动物的区别在

抽象工厂模式&lt;Abstract Factory&gt;

概述 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.让子类决定实例化哪一个类 角色 抽象工厂(Creator):这个抽象类(或接口)声明一个创建对象的工厂方法,用来返回一个Product类型的对象. 具体工厂(ConcreteCreator):重定义工厂方法,返回一个具体的Concrete Product实例. 抽象产品(Product):定义工厂方法所创建的对象 具体产品(ConcreteProduct): 具体产品,继承自Product抽象类. 解读 UML图 c#代码

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

1.模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象. 为了更清晰地理解工厂方法模式,需要先引入两个概念: 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌