设计模式之工厂模式

工厂模式大致可以分为三类:
1、简单工厂模式
2、工厂方法模式
3、抽象工厂模式。
这三种模式逐步抽象,并且更具有一般性。
工厂模式有一种非常形象的描述,建立对象的类就像一个工厂,而需要被建立的对象就是一个个产品,在工厂中加工产品,使用产品的人不用关心产品是如何生产出来的。在软件中使用工厂模式的好处就是降低了模块之间的耦合。设计模式的实现是基于C++多态来实现的。

简单工厂模式

一、简单工厂模式:
简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的产品类型,工厂类就会返回需要的产品对象。
例:现在有一个工厂生产A,B两种类型的产品。使用工厂模式设计就是有一个工厂类Factory,可以根据输入的类型(typeA,typeB)从而创建相应的A类型对象,B类型对象。

enum{ typeA, typeB };

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

class productA : public product{
public:
    virtual void show(){
        cout<< "productA" << endl;
    }
};

class productB : public product{
public:
    virtual void show(){
        cout<< "productB" << endl;
    }
};

class Factory{
public:
    static product* createproduct(int type){
        switch(type){
        case typeA:
            return new productA();
            break;
        case typeB:
            return new productB();
            break;
        }
    }
};

int main()
{
    Factory f;
    product* pA = f.createproduct(typeA);
    product* pB = f.createproduct(typeB);
    pA->show();
    pB->show();
    return 0;
}

简单工厂模式的话统一了创建对象的接口,隐藏了创建对象的细节,只要知道产品的类型就可以创建出产品对象。

但是简单工厂模式不易对产品进行扩展,比如现在又出来了一种C类型的产品,那要修改的地方就很多了,首先要添加一个C类型的产品类,还有在工厂类中再添加一个分支,这违背了开闭原则。
所以简单工厂模式适用于产品子类不多的场合

工厂方法模式

由于简单工厂模式违反了开闭原则,所以工厂方法模式的出现了,工厂方法模式是在简单工厂模式的基础上,对”工厂”添加了一个抽象层,将工厂的动作抽象出来,作为抽象类,而具体的行为由工厂类的子类去实现,让工厂类的子类决定去生产什么类型的产品。

工厂方法模式与简单工厂模式不同的是,简单工厂模式是将判断创造哪一个“产品”的逻辑交给工厂类的内部。而工厂方法模式是将要创造哪个对象交给用户。

工厂方法模式提供了一个抽象的工厂类接口,而具体的生产则是放到工厂类的子类当中,这样进一步抽象使得以后再增加新的产品的时候非常简单,不必修改原有代码,只需要增加一个新的工厂子类就可以了。

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

class productA: public product{
public:
    virtual void show(){
        cout<< "productA"<<endl;
    }
};

class productB: public product{
public:
    virtual void show(){
        cout<<"productB"<<endl;
    }
};

class Factory{
public:
    virtual product* createproduct() = 0;
};

class FactoryA: public Factory{
public:
    virtual product* createproduct(){
        return new productA();
    }
};

class FactoryB: public Factory{
public:
    virtual product* createproduct(){
        return new productB();
    }
};

int main()
{
    Factory* pFA = new FactoryA();
    Factory* pFB = new FactoryB();
    pFA->createproduct()->show();
    pFB->createproduct()->show();
    return 0;
}

三、抽象工厂模式:
工厂方法模式和简单工厂模式都适用于”产品种类结构单一”的场合,为一类产品提供创建的接口。
例如生产钢笔的工厂只生产钢笔这一类产品,如果使用工厂方法模式的话,则这个工厂就不能同时生产铅笔。
如果想让生产钢笔的工厂同时生产铅笔的话,则可以使用抽象工厂模式。
抽象工厂模式使用与产品种类结构多的场合(比如A工厂里面既有高档钢笔也有高档铅笔),主要用于创建一组相关的产品,为他们提供创建的接口。

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

class pen1 :public pen{
public:
    virtual void show(){
        cout<< "good pen"<<endl;
    }
};

class pen2 :public pen{
public:
    virtual void show(){
        cout<< "bad pen"<<endl;
    }
}; 

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

class pencil1 :public pencil{
public:
    virtual void show(){
        cout<<"good pencil"<<endl;
    }
};

class pencil2 :public pencil{
public:
    virtual void show(){
        cout<<"bad pencil"<<endl;
    }
};

class Factory{
public:
    virtual pen* createpen() = 0;
    virtual pencil* createpencil() = 0;
};

class Factory1 : public Factory{
public:
    virtual pen* createpen(){
        return new pen1();
    }
    virtual pencil* createpencil(){
        return new pencil1();
    }
};

class Factory2 : public Factory{
public:
    virtual pen* createpen(){
        return new pen2();
    }
    virtual pencil* createpencil(){
        return new pencil2();
    }
};

int main()
{
    Factory* f1 = new Factory1();
    f1->createpen()->show();
    f1->createpencil()->show();

    Factory* f2 = new Factory2();
    f2->createpen()->show();
    f2->createpencil()->show();
    return 0;
}

抽象工厂模式封装了产品的创建,只要我们知道工厂就可以创建出一组产品。但是缺点也很明显,比如新增一个产品,要在每个工厂中再添加一种方法,违反了开闭原则。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值