读书人

容易工厂与工厂模式

发布时间: 2012-10-28 09:54:44 作者: rapoo

简单工厂与工厂模式
简单工厂并不是一个“真正的“模式,可以把它当作一种编程习惯。

工厂方法模式:定义了一个创建对象的接口,但由于类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

要点:
1.所有的工厂都是用来封闭对象的创建
2.简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦
3.工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象
4.所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合
5.工厂方法允许类将实例化延迟到子类进行
6.依赖倒置原则,指导我们避免依赖具体类型,而要尽量依赖抽象

设计原则:依赖倒置:依赖抽象,不要依赖具体类
1.变量不可以持有具体类的引用
2.不要让类派生自具体类
3.不要覆盖基类中已实现的方法


Pizza.h

#ifndef PIZZA_H#define PIZZA_H#include<iostream>using namespace std;enum PizzaType{    CHEESEPIZZA,    VEGGIEPIZZA,    CLAMPIZZA,    PEPPERONIPIZZA};class Pizza{public:    virtual void prepare(){        cout << "prepare..." << endl;    }    void bake(){        cout << "bake..." << endl;    }    void cut(){        cout << "cut..." << endl;    }    void box(){        cout << "box..." << endl;    }};class CheesePizza:public Pizza{};class NYStyleCheesePizza:public Pizza{};class VeggiePizza:public Pizza{};class NYStyleVeggiePizza:public Pizza{};class ClamPizza:public Pizza{};class NYStyleClamPizza:public Pizza{};class PepperonPizza:public Pizza{};class NYStylePepperonPizza:public Pizza{};#endif // PIZZA_H

PizzaStore.h
#ifndef PIZZASTORE_H#define PIZZASTORE_H#include"Pizza.h"#include"SimplePizzaFactory.h"class PizzaStore{public:    explicit PizzaStore(SimplePizzaFactory* spf=NULL){        mFactory = spf;    }    //工厂方法    virtual Pizza* createPizza(PizzaType pt)=0;    //由于pizza是抽象的,orderPizza并不知道哪些实例加进来,也就是解耦    Pizza* orderPizza(PizzaType pt){        Pizza* pizza;        //pizza = mFactory->cratePizza(pt);        pizza = createPizza(pt);        pizza->prepare();        pizza->bake();        pizza->cut();        pizza->box();        return pizza;    }private:    SimplePizzaFactory* mFactory;};class NYPizzaStore:public PizzaStore{public:    Pizza* createPizza(PizzaType pt){        switch(pt){        case CHEESEPIZZA:            return new NYStyleCheesePizza;            break;        case VEGGIEPIZZA:            return new NYStyleVeggiePizza;            break;        case PEPPERONIPIZZA:            return new NYStylePepperonPizza;            break;        case CLAMPIZZA:            return new NYStyleClamPizza;            break;        default:            return NULL;            break;        }    }};#endif // PIZZASTORE_H


SimplePizzaFactory.h
#ifndef SIMPLEPIZZAFACTORY_H#define SIMPLEPIZZAFACTORY_H#include"Pizza.h"#include<stdlib.h>//简单工厂class SimplePizzaFactory{public:    Pizza* cratePizza(PizzaType pt){        switch(pt){        case CHEESEPIZZA:            return new CheesePizza;            break;        case VEGGIEPIZZA:            return new VeggiePizza;            break;        case PEPPERONIPIZZA:            return new PepperonPizza;            break;        case CLAMPIZZA:            return new ClamPizza;            break;        default:            return NULL;            break;        }    }};class NYPizzaFactory:public SimplePizzaFactory{public:    Pizza* createPizza(PizzaType pt){        switch(pt){        case CHEESEPIZZA:            return new NYStyleCheesePizza;            break;        case VEGGIEPIZZA:            return new NYStyleVeggiePizza;            break;        case PEPPERONIPIZZA:            return new NYStylePepperonPizza;            break;        case CLAMPIZZA:            return new NYStyleClamPizza;            break;        default:            return NULL;            break;        }    }};#endif // SIMPLEPIZZAFACTORY_H

main.cpp
#include"PizzaStore.h"int main(){    PizzaStore *store = new NYPizzaStore();    store->orderPizza(CHEESEPIZZA);}prepare...bake...cut...box...

读书人网 >编程

热点推荐