赞
踩
/* 简单工厂 Simple Factory: 优点: 把对象的创建封装在一个接口函数里面,通过传入不同的标识,返回创建的对象,客户不用自己负责new对象 缺点 : 提供创建对象实例的接口函数不闭合,不能对修改关闭,对扩展开放 工厂方法 Factory Method 优点: Factory基类,提供一个纯虚函数(创建产品),定义派生类(具体产品的工厂)负责创建对应的产品,可以做到不同的产品在不同的工厂创建,能够对现有工厂,以及产品的修改关闭 缺点: 实际上,很多产品是有关联关系的,属于一个产品族,不应该放在不同的工厂取创建,这样一不符合实际的产品对象创建逻辑,二是工厂类太多了,不好维护 抽象工厂 Abstract Factory 把有关联关系的,属于一个产品族的所有产品创建的接口函数,放在一个抽象工厂里面AbstractFactory,派生类(具体产品的工厂)应该负责创建该产品簇里面的所有产品 工厂模式: 主要是封装了对象的创建 */
- class Car
- {
- public:
- Car(string name) :_name(name) {}
- virtual void show() = 0;
- protected:
- string _name;
- };
- class Bmw:public Car
- {
- public:
- Bmw(string name) :Car(name) {}
- void show()
- {
- cout << "获取了一辆宝马汽车:" << _name << endl;
- }
- };
-
- class Audi :public Car
- {
- public:
- Audi(string name) :Car(name) {}
- void show()
- {
- cout << "获取了一辆奥迪汽车:" << _name << endl;
- }
- };
-
- // 产品枚举
- enum Cartype
- {
- BMW, AUDI
- };
- // 简单工厂类
- class SimpleFactory
- {
- public:
- // 用户想要创建一个对象,只需要知道名称就可以了
- Car* createCar(Cartype ct)
- {
- switch (ct)
- {
- case BMW:
- return new Bmw("x6");
- case AUDI:
- return new Audi("a8");
- default:
- cerr << "传入参数错误:" << ct << endl;
- }
- return nullptr;
- }
- };
-
- int main()
- {
- unique_ptr<SimpleFactory> fac(new SimpleFactory());
- unique_ptr<Car> p1(fac->createCar(BMW));
- unique_ptr<Car> p2(fac->createCar(AUDI));
-
- p1->show();
- p2->show();
-
- return 0;
- }
-
- // 系列产品
- class Car
- {
- public:
- Car(string name) :_name(name) {}
- virtual void show() = 0;
- protected:
- string _name;
- };
- class Bmw:public Car
- {
- public:
- Bmw(string name) :Car(name) {}
- void show()
- {
- cout << "获取了一辆宝马汽车:" << _name << endl;
- }
- };
- class Audi :public Car
- {
- public:
- Audi(string name) :Car(name) {}
- void show()
- {
- cout << "获取了一辆奥迪汽车:" << _name << endl;
- }
- };
-
- // 基类(包含纯虚函数,不能实例化对象)
- class Factory
- {
- public:
- virtual Car* createCar(string name) = 0;
- };
- // 宝马汽车工厂,负责生产宝马汽车
- class BmwFac: public Factory
- {
- public:
- Car* createCar(string name)
- {
- return new Bmw(name);
- }
- };
-
- // 奥迪汽车工厂,负责生产奥迪汽车
- class AudiFac :public Factory
- {
- public:
- Car* createCar(string name)
- {
- return new Audi(name);
- }
- };
-
-
- int main()
- {
- unique_ptr<Factory> bmwfty(new BmwFac());
- unique_ptr<Factory> audifty(new AudiFac());
- unique_ptr<Car> p1 (bmwfty->createCar("X6"));
- unique_ptr<Car> p2 (audifty->createCar("A8"));
-
- p1->show();
- p2->show();
-
- return 0;
- }
- // 系列产品1:汽车
- class Car
- {
- public:
- Car(string name) :_name(name) {}
- virtual void show() = 0;
- protected:
- string _name;
- };
- class Bmw:public Car
- {
- public:
- Bmw(string name) :Car(name) {}
- void show()
- {
- cout << "获取了一辆宝马汽车:" << _name << endl;
- }
- };
- class Audi :public Car
- {
- public:
- Audi(string name) :Car(name) {}
- void show()
- {
- cout << "获取了一辆奥迪汽车:" << _name << endl;
- }
- };
- // 系列产品2:车灯
- class Light
- {
- public:
- virtual void show() = 0;
- };
- class BmwLight : public Light
- {
- public:
- void show() { cout << "BMW light!" << endl; }
- };
- class AudiLight : public Light
- {
- public:
- void show() { cout << "Audi light!" << endl; }
- };
-
-
-
- // 工厂方法 => 抽象工厂(对有一组关联关系的产品簇提供产品对象的统一创建)
- class AbstractFactory
- {
- public:
- virtual Car* createCar(string name) = 0; // 工厂方法 创建汽车
- virtual Light* createCarLight() = 0; // 工厂方法 创建汽车关联的产品,车灯
- };
- // 宝马工厂
- class BMWFactory : public AbstractFactory
- {
- public:
- Car* createCar(string name)
- {
- return new Bmw(name);
- }
- Light* createCarLight()
- {
- return new BmwLight();
- }
- };
- // 奥迪工厂
- class AudiFactory : public AbstractFactory
- {
- public:
- Car* createCar(string name)
- {
- return new Audi(name);
- }
- Light* createCarLight()
- {
- return new AudiLight();
- }
- };
-
-
- int main()
- {
- unique_ptr<AbstractFactory> bmwfty(new BMWFactory());
- unique_ptr<AbstractFactory> audifty(new AudiFactory());
- unique_ptr<Car> p1(bmwfty->createCar("X6"));
- unique_ptr<Car> p2(audifty->createCar("A8"));
- unique_ptr<Light> l1(bmwfty->createCarLight());
- unique_ptr<Light> l2(audifty->createCarLight());
-
- p1->show();
- l1->show();
-
- p2->show();
- l2->show();
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。