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

本文通过国旗生产实例,介绍了简单工厂模式和工厂模式的概念、实现及优缺点。对比两种模式的类图和程序代码,分析了它们在扩展性和维护性方面的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

简单工厂模式

         简单工厂模式又称静态工厂方法(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、增加功能时可以不用改变原有的程序。并且可以增加一些复杂的功能

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值