二十三种设计模式——工厂模式

二十三种设计模式——工厂模式

简单工厂模式

简单工厂模式又称静态工厂方法(StaticFactory Method)模式,不属于23种模式之一。

简单工厂模式是工厂模式最简单使用的模式。

类图:

程序:

#include <iostream>
#include<string>
using namespace std;
 class NationalFlag//父类
{
    public:
    NationalFlag(){}
    ~NationalFlag(){}
    virtual void display()const = 0;
};
class ChinaFlag:public NationalFlag//子类中国国旗
{
    public:
    ChinaFlag()
    {
        cout<<"生产中国国旗"<<endl;
    }
    ~ChinaFlag(){}
    void display() const
    {
        cout<<"中国国旗完成"<<endl;
        //cout<<"长:"<<length<<"宽:"<<width<<endl;
    }
};
class UsaFlag:public NationalFlag//子类美国国旗
{
    public:
    UsaFlag()
    {
        cout<<"正在生产美国国旗"<<endl;
    }
    void display() const
    {
        cout<<"美国国旗完成"<<endl;
        //cout<<"长:"<<length<<"宽:"<<width<<endl;
    }
};
class factory//简单工厂
{
    public:
    static NationalFlag *createFlag(string type)
    {

        if(type=="USA")
        {
            return new UsaFlag();
        }
        else if(type=="china")
        {
            return new ChinaFlag();
        }
        return NULL;
    }
};
int main()
{
    NationalFlag *n=NULL;
    n=factory::createFlag("china");
    n->display();
    delete n;
    n=NULL;
    //cout << "Hello world!" << endl;
    return 0;
}

是否满足开闭原则:

遵循开闭原则设计出的模块具有两个主要特征:

(1)对于扩展是开放的(Open for extension)。这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。

(2)对于修改是关闭的(Closed for modification)。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。模块的二进制可执行版本,无论是可链接的库、DLL或者.EXE文件,都无需改动。

一部分满足开闭原则:1、增加功能时可以不用改变原有的程序。2、但是想增加一些复杂的功能变得非常困难。

是否满足可复用性和可扩展性:

满足可复用性、不满足可维护性:因为简单工厂中都是模块与模块之间联系,所以可复用性比较好。当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利。

工厂模式:

类图:

程序

#include <iostream>
#include<string>
using namespace std;
 class NationalFlag//父类
{
    public:
    NationalFlag(){}
    ~NationalFlag(){}
    virtual void display()const = 0;
};
class ChinaFlag:public NationalFlag//子类中国国旗
{
    public:
    ChinaFlag()
    {
        cout<<"生产中国国旗"<<endl;
    }
    ~ChinaFlag(){}
    void display() const
    {
        cout<<"中国国旗完成"<<endl;
        //cout<<"长:"<<length<<"宽:"<<width<<endl;
    }
};
class UsaFlag:public NationalFlag//子类美国国旗
{
    public:
    UsaFlag()
    {
        cout<<"正在生产美国国旗"<<endl;
    }
    void display() const
    {
        cout<<"美国国旗完成"<<endl;
        //cout<<"长:"<<length<<"宽:"<<width<<endl;
    }
};
class factory//简单工厂
{
    public:
    factory(){}
    ~factory(){}
    virtual NationalFlag *createFlag(string type) const=0;

};
class chinaFactory: public factory
{
    public:
    chinaFactory(){cout<<"中国国旗工厂"<<endl;}
    ~chinaFactory(){}
    NationalFlag * createFlag(string type) const
    {
        return new ChinaFlag();
    }
};
class UsaFactory:public factory
{
    public:
    UsaFactory(){cout<<"美国国旗工厂"<<endl;}
    ~UsaFactory(){}
     NationalFlag * createFlag(string type) const
    {
        return new UsaFlag();
    }
};
int main()
{
    factory * f=NULL;
    f=new chinaFactory();
    NationalFlag *n=f->createFlag("中国");
    n->display();
    //cout << "Hello world!" << endl;
    return 0;
}

是否满足开闭原则:

满足开闭原则:1、增加功能时可以不用改变原有的程序。并且可以增加一些复杂的功能

是否满足可复用性和可扩展性:

满足可复用性与可维护性:因为每个产品与工厂都独立,所以需要哪个就直接使用就可以了,所以满足复用。可维护性:因为增加了工厂类,每一个工厂生产每一类产品。就算增加了,只需要在增加工厂就可以了。维护性好。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-17 07:17:01

二十三种设计模式——工厂模式的相关文章

23种设计模式--工厂模式-Factory Pattern

一.工厂模式的介绍       工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例就就依赖与这个类,2者之间的耦合度就高,此时我们就可以使用面向对象的去解决这个问题,将变化点封装起来,这就是我们将要首先引入的简单工厂模式:先来说一个场景,比如我们吃水果这个例子吧,我们有时候想吃苹果,有时候想吃橘子,但是每次都需要去买这些水果,后来有个水果店,又卖橘子,又卖苹果,这个水果店就当于简

二十三种设计模式及其python实现

本文源码寄方于github:https://github.com/w392807287/Design_pattern_of_python 参考文献: <大话设计模式>——吴强 <Python设计模式>——pythontip.com <23种设计模式>——http://www.cnblogs.com/beijiguangyong/ 设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用

二十三种设计模式 罗列

1.工厂方法模式(Factory Method) 2.抽象工厂模式(Abstract Factory) 3.单例模式(Singleton) 4.建造者模式(Builder) 5.原型模式(ProtoType) 6.适配器模式(Adapter) 7.装饰模式(Decorator) 8.代理模式(Proxy) 9.外观模式(Facade) 10.桥接模式(Bridge) 11.组合模式(Composite) 12.享元模式(FlyWeight) 13.策略模式(Strategy) 14.模板方法模式

二十三种设计模式之:工厂方法模式

工厂方法模式是将工厂类放到一个方法种进行创建,这样既可以实现工厂类的创建,又可以不修改工厂类的代码,从而对功能进行扩展,这样设计的另一个好处是:对代码实现了很好的封装. 例: 创建一个工厂接口 public interface Sender{ public void send(); } 两个工厂实现类 public class MailSender implements Sender{ @Override public void send(){ System.out.println("This

二十三种设计模式[20] - 状态模式(State Pattern)

前言 状态模式,对象行为型模式的一种.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类 ". 场景 我们都坐过火车,火车可以简单的分为" 开门 "," 关门 "," 运行 "," 停止 "四个状态.火车在这四个状态下分别可以做不同的事情.比如只有在关门时才行运行.只有在停止时才能开门. 我们在开发类似的业务时,往

二十三种设计模式[12] - 代理模式(Proxy Pattern)

前言 代理模式,属于对象结构型模式.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 为其它对象提供一种代理以控制对这个对象的访问 ". 在代理模式中,通常使用一个类来代表另一个类的功能,并由这个代理对象去控制原对象的引用. 结构 Subjuet(公共接口):代理类和被代理类的公共接口,保证任何使用目标的地方都可以被代理类替换: RealSubject(被代理类):代理类所代表的目标类: Proxy(代理类):包含对目标类的引用,目标类的封装: 场景 在日常生活中

二十三种设计模式[17] - 中介者模式(Mediator Pattern)

前言 在开发软件的过程中,我们通常会将类设计的比较单纯,使其复用性更高.但类间的相互引用又使得类本身在没有其他类的支持下不能正常工作,导致其复用性降低.所以为了提高类的复用性我们需要尽可能的减少对其它类的引用,也就是说我们常说的解耦.中介者模式,顾名思义,就是存在一个类似中介的角色,类与类之间不直接交互而是通过中介进行间接的交互,也就意味着类与类之间不需要存在显示的引用,以达到松耦合的目的. 中介者模式,对象行为型模式的一种.在<设计模式 - 可复用的面向对象软件>一书中将之描述为"

二十三种设计模式[21] - 策略模式(Strategy Pattern)

前言 策略模式,对象行为型模式的一种.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 定义一些列的算法,把它们一个个封装起来,并且使它们可相互替换.使得算法可以独立于使用它的客户而变化 ". 也就是说通过策略模式,我们能够将算法与其调用者分离成相对独立的个体,降低维护成本,使代码更加优雅. 场景 就拿数据的搜索来说,可以简单的分为模糊搜索和精确搜索.在开发这个功能时,可能会写出如下代码. public List<string> Search(stri

二十三种设计模式[23] - 访问者模式(Visitor Pattern)

前言 访问者模式,是一种将数据的结构与其操作分离的类行为型模式.它能够帮助我们解决数据结构稳定但数据操作多变的问题,使我们可以很容易的增加或修改数据的操作. 在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作 ". 结构 Visitor(访问者接口):定义了每种元素的访问行为,一般情况下访问行为的个数与元素种类的个数一致: ConcretVisitor(具体访问