C++工厂模式

1、设计模式分类

总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

2、设计模式的六大设计原则

单一职责原则:类的设计尽量做到只有一个原因可以引起它的改变
里氏替换原则:只要父类出现的地方子类就可以出现,且替换成子类也不会出现任何错误或者异常
依赖倒置原则:针对接口编程,而不是针对实现编程
接口隔离原则:不要建立臃肿庞大的接口。即接口尽量细化,同时接口中的方法尽量少
迪米特法则: 一个对象应该对其他对象有最少的了解,也就是说一个类要对自己需要耦合或者调用的类知道的最少
开闭原则: 一个软件实体,比如类,模块,函数应该对扩展开放,对修改关闭

3、工厂模式

3.1、简单工厂模式:

它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类(增加判断分支),违背了封闭开放原则。

enum CTYPE {A, B};  

//基类:水果
class Fruit  
{  
public:  
    virtual void Show() = 0;
};  

//橘子子类  
class Orange: public Fruit  
{  
public:  
    void Show() { cout<<"this is orange"<<endl; }  
};  

//苹果子类  
class Apple: public Fruit  
{  
public:  
    void Show() { cout<<"this is apple"<<endl; }  
};  

//生成水果的工厂,可以生产两种不同的水果,想生成哪种水果在工厂内部判断

class Factory  
{  
public:   
    Fruit* CreateFruit(enum CTYPE ctype)  
    {  
        if(ctype == A)  
            return new Orange(); 
        else if(ctype == B)  
            return new Apple(); 
        else  
            return NULL;  
    }  
};

3.2、工厂方法模式:

把简单工厂模式的判断都生成一个工厂子类,这样的话每次添加产品子类的时候,只需再添加一个工厂子类就可以了。这样就完美的遵循了开放-封闭原则(扩展而不修改)。

//基类:水果
class Fruit  
{  
public:  
    virtual void Show() = 0;
};  

//橘子子类  
class Orange: public Fruit  
{  
public:  
    void Show() { cout<<"this is orange"<<endl; }  
};  

//苹果子类  
class Apple: public Fruit  
{  
public:  
    void Show() { cout<<"this is apple"<<endl; }  
}; 
class Factory  
{  
public:  
    virtual Fruit* CreateFruit() = 0;
};  

//生产橘子的工厂

class FactoryA: public Factory  
{  
public:  
    Fruit* CreateFruit() { return new Orange; }  
};  

//生产苹果的工厂

class FactoryB: public Factory  
{  
public:  
    Fruit* CreateFruit() { return new Apple; }  
};  

3.3、抽象工厂模式:
工厂模式和简单工厂模式要求产品子类必须要是同一类型的,拥有共同的方法,这就限制了产品子类的扩展。于是为了更加方便的扩展,抽象工厂模式就将同一类的产品子类归为一类,让他们继承同一个抽象子类,我们可以把他们一起视作一组,然后好几组产品构成一族。

//基类:水果
class Fruit  
{  
public:  
    virtual void Show() = 0;
};  

//橘子子类  
class Orange: public Fruit  
{  
public:  
    void Show() { cout<<"this is orange"<<endl; }  
};  

//苹果子类  
class Apple: public Fruit  
{  
public:  
    void Show() { cout<<"this is apple"<<endl; }  
};
//基类:蔬菜  
class Vegetalbles    
{  
public:  
    virtual void Show() = 0;
};  

//番茄子类
class Tomato : public Vegetalbles    
{  
public:  
    void Show() { cout<<"this is tomato"<<endl; }  
  
};  

//土豆子类
class Potato : public Vegetalbles    
{  
public:  
    void Show() { cout<<"this is potato"<<endl; }  
};  
//基类:工厂  
class BaseFactory    
{  
public:  
    virtual Fruit* CreateFruit() = 0;
    virtual Vegetalbles* CreateVegetables() = 0;
};  

//生产橘子和番茄的工厂  
class FactoryA :public BaseFactory  
{  
public:  
    Fruit* CreateFruit() { return new Orange(); }  
    Vegetalbles* CreateVegetables() { return new Tomato(); }  
};  

//生产苹果和土豆的工厂  
class FactoryB : public BaseFactory  
{  
public:  
    Fruit* CreateFruit() { return new Apple(); }  
    Vegetalbles* CreateVegetables() { return new Potato(); }  
}; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值