设计模式之五:工厂方法模式(Factory Method)

工厂方法模式:定义了一个创建对象的接口,由子类来决定详细实例化那个对象。工厂方法模式让类的实例化转移到子类中来推断。

Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.

UML图:

主要包含:

  1. Product(Page):定义了工厂类创建的对象的接口
  2. ConcreteProduct(SkillPage,EducationPage,ExperiencePage):实现了Product的详细的类
  3. Creator(Document):声明了一个工厂方法,这种方法返回一个Product类型的对象。
  4. ConcreteCreator(Report,Resume):重写工厂方法来实例化详细的Product

上面的UML是工厂方法模式一般的图例,针对一个详细的有两个ConcreteProductA,ConcreteProductB。以及它们各自工厂类ConcreteCreatorA。ConcreteCreatorB的UML图例如以下所看到的:

C++代码例如以下:

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

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

class ConcreteProductA:public Product
{
    public:
            void show()
            {
                std::cout<<"ConcreteProductA:show"<<std::endl;
            }
};

class ConcreteProductB:public Product
{
    public:
            void show()
            {
                std::cout<<"ConcreteProductB:show"<<std::endl;
            }

};

class Creator
{
    public:
            virtual Product * factoryMethod()=0;

};

class ConcreteCreatorA:public Creator
{
    public:
            Product* factoryMethod()
            {
                return new ConcreteProductA();
            }

};

class ConcreteCreatorB:public Creator
{
    public:
            Product* factoryMethod()
            {
                return new ConcreteProductB();
            }

};

int main()
{
    std::cout<<"工厂方法模式"<<std::endl;
    Creator * creatorA=new ConcreteCreatorA;
    Creator * creatorB=new ConcreteCreatorB;

    Product * pa=creatorA->factoryMethod();
    Product* pb=creatorB->factoryMethod();

    pa->show();
    pb->show();

    delete creatorA;
    delete creatorB;
    delete pa;
    delete pb;
    return 0;
}

測试输出:

事实上还能够一个详细的ConcreteCreator相应多个ConcreteProduct,这里以一个样例为例分析:

  1. Product为Page
  2. ConcreteProduct包含SkillPage,EducationPage,ExperiencePage
  3. Creator为Document(文档)
  4. ConcreteCreator为Report(报告文档,报告文档中有SkillPage,EducationPage),Resume(简历文档。简历文档中有SkillPage,EducationPage,ExperiencePage)

这也是一个工厂方法模式的样例

UML图为:

C++代码实现例如以下:

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

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

class SkillPage:public Page
{
        public:
                void show()
                {
                    std::cout<<"SkillPage::show"<<std::endl;
                }
};

class EducationPage:public Page
{
        public:
                void show()
                {
                    std::cout<<"Education::show"<<std::endl;
                }

};

class ExperiencePage:public Page
{
        public:
                void show()
                {
                    std::cout<<"Experience::show"<<std::endl;
                }
};

class Document
{
    public:
            virtual void factoryMethod()=0;
            list<Page*>& getLists()
            {
                return lists;
            }
            void print()
            {
                list<Page*>::iterator iter;
                for(iter=lists.begin();iter!=lists.end();iter++)
                        (*iter)->show();
            }
            //注意这里要将list中的指针指向的内存删除掉,不然会造成内存泄露
            virtual ~Document(){
                list<Page*>::iterator iter;
                for(iter=lists.begin();iter!=lists.end();iter++)
                {
                    if(*iter)
                            delete *iter;
                }
            }
    private:
            list<Page*> lists;
};

class Report:public Document
{
    public:
            void factoryMethod()
            {
                getLists().push_back(new SkillPage());
                getLists().push_back(new EducationPage());
            }
};

class Resume:public Document
{
    public:
            void factoryMethod()
            {
                getLists().push_back(new SkillPage());
                getLists().push_back(new EducationPage());
                getLists().push_back(new ExperiencePage());
            }
};

int main()
{
    std::cout<<"详细的工厂方法模式測试"<<std::endl;
    Document * report=new Report();
    Document * resume=new Resume();
    report->factoryMethod();
    resume->factoryMethod();
    std::cout<<"report print"<<std::endl;
    report->print();
    std::cout<<"resume print"<<std::endl;
    resume->print();
    return 0;

}

測试输出:

时间: 2024-08-23 19:00:42

设计模式之五:工厂方法模式(Factory Method)的相关文章

设计模式-03工厂方法模式(Factory Method Pattern)

插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背"开闭原则". 1.模式动机 考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮.矩形按钮.菱形按钮等),这些按钮都源自同一个基类,不过在继承基类后不同的子类有不同的实现方式从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的

php设计模式——工厂方法模式(Factory Method)

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

Android设计模式——工厂方法模式(Factory Method)

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

工厂方法模式(Factory Method Pattern)

2. 工厂方法模式(Factory Method Pattern) 2.1. 模式动机 现在对该系统进行修改,不再设计一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成,我们先定义一个抽象的按钮工厂类,再定义具体的工厂类来生成圆形按钮.矩形按钮.菱形按钮等,它们实现在抽象按钮工厂类中定义的方法.这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品,如果出现新的按钮类型,只需要为这种新类型的按钮创建一个具体的工厂类就可以获得该新按钮的实例,这一

工厂模式--工厂方法模式(Factory Method Pattern)

2.1. 模式动机 现在对该系统进行修改,不再设计一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成,我们先定义一个抽象的按钮工厂类,再定义具体的工厂类来生成圆形按钮.矩形按钮.菱形按钮等,它们实现在抽象按钮工厂类中定义的方法.这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品,如果出现新的按钮类型,只需要为这种新类型的按钮创建一个具体的工厂类就可以获得该新按钮的实例,这一特点无疑使得工厂方法模式具有超越简单工厂模式的优越性,更加符合"开闭

设计模式之六:工厂方法模式(Factory method Pattern)

工厂方法(Factory Method)模式就是定义一个创建对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责具体产品的创建,仅提供了具体工厂子类必须实现的接口,这样核心类成为一个抽象工厂角色,这样做的好处是工厂方法模式可以使系统在不修改具体工厂角色的情况下进行引进新的产品. 在Factory Method模式中,工厂类与产品类往往具有平行的等级结构,它们之间一一对应. 从上图可以看出,工厂方法模式有四个角色: 抽象工厂角色(ICreator):是工厂方法模式的核心,与应用程序无

工厂方法模式 Factory Method

工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. #include <iostream> using namespace std; class Fruit{ public: virtual void show()=0; }; class App

3.工厂方法模式(Factory Method)

using System; using System.Reflection; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //需要什么食物,创建什么工厂 FactoryCreate _factorycreate = new YaJiaFactoryCreate(); Food _food = _factorycreate.Create(); _food.MakeFood();

设计模式【工厂方法模式】

本文介绍设计模式中的[工厂模式].首先介绍工厂模式的作用,工厂模式主要是为创建对象提供过度接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 其中一些资料会将工厂模式,分为三类,这三类的分类为: 1. 简单工厂模式(Simple Factory) 2. 工厂方法模式(Factory Method) 3. 抽象工厂模式(Abstract Factory) 但是某些资料会将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类.所以分为:工厂方法模式(F

设计模式——3.工厂方法模式

1. 模式动机 学习完简单工厂模式之后,现在对该系统进行修改,不再设计一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成,我们先定义一个抽象的按钮工厂类,再定义具体的工厂类来生成圆形按钮.矩形按钮.菱形按钮等,它们实现在抽象按钮工厂类中定义的方法.这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品,如果出现新的按钮类型,只需要为这种新类型的按钮创建一个具体的工厂类就可以获得该新按钮的实例,这一特点无疑使得工厂方法模式具有超越简单工厂模式的优