学习软件设计向OO高手迈进 设计模式(Design pattern)是软件开发人员在软件开发过程中面临的一般问题的解决方案。 这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 是前辈大神们留下的软件设计的"招式"或是"套路"。
什么是工厂模式
对于工厂模式具体上可以分为三类
简单工厂模式
简单工厂模式是最简单的设计模式之一其实它并不属于GOF的23种设计模式但应用也十分频繁同时也是其余创建型模式的基础因此有必要先学习简单工厂模式。
简单工厂基本实现流程
定义
定义一个简单工厂类它可以根据参数的不同返回不同类的实例被创建的实例通常都具有共同的父类
简单工厂模式结构
从简单工厂模式的定义可以看出在简单工厂模式中大体上有3个角色
UML类图
其UML类图如下
Version 1.0
下面我们使用手机生产来讲解该模式
一、定义抽象产品类AbstractProduct
Phone类手机类AbstractProduct
class Phone {public:virtual void make(void) 0;};
二、定义具体产品类
MiPhone类小米手机类Product1
class MiPhone : public Phone {public:MiPhone() {this->make();}virtual void make(void) {cout << "make xiaomi phone!" << endl;}};
IPhone类苹果手机类Product2
class IPhone : public Phone {public:IPhone() {this->make();} virtual void make(void) {cout << "make iphone!" << endl;}};
三、定义工厂类和工厂方法
SimpleFactory类手机生产工厂类Factory
class SimpleFactory {public:static Phone* makePhone(const string "MiPhone") {return new MiPhone();} else if (phoneType "iPhone") {return new IPhone();} return nullptr;}};
四、客户端
int main(int argc, char** argv) {// make xiaomi phone!Phone* miPhone SimpleFactory::makePhone("MiPhone"); // make iphonePhone* iPhone SimpleFactory::makePhone("iPhone"); return 0;}
执行结果
make xiaomi phone!make iphone!
Version 1.1
扩展增加生产华为手机实现
一、扩展具体产品类
Huawei类华为手机类Product3
class HuaweiPhone : public Phone {public:HuaweiPhone() {this->make();} virtual void make(void) {cout << "make huawei phone!" << endl;}};
二、扩展工厂类方法
SimpleFactory类手机生产工厂类Factory
class SimpleFactory {public:static Phone* makePhone(const string "MiPhone") {return new MiPhone();} else if (phoneType "iPhone") {return new IPhone();} else if (phoneType "HuaweiPhone") {return new HuaweiPhone();}return nullptr;}};
三、扩展客户端
int main(int argc, char** argv) {// make xiaomi phone!Phone* miPhone SimpleFactory::makePhone("MiPhone");// make iphonePhone* iPhone SimpleFactory::makePhone("iPhone");// make huawei phonePhone* huaweiphone SimpleFactory::makePhone("HuaweiPhone");return 0;}
执行结果
make xiaomi phone!make iphone!make huawei phone!
在简单工厂模式中工厂类是整个模式的关键所在。它包含了必要的判断逻辑能够根据外界给定的条件去判断应该创建哪个具体类的实例。用户在使用时可以直接根据工厂类去创建所需的实例而无需关心这些对象是如何组织并创建的从这一点上来说这有利于整个软件体系结构的优化。但是简单工厂模式的缺点也正体现在工厂类上由于工厂类中集中了所有实例的创建逻辑当我们增加了一个新的 具体类时需要同时修改工厂类多加一个if这违反了“开闭原则”。
优点
缺点
适用场合
工厂方法模式(Factory Method)
定义
定义一个用于创建对象的接口但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
简单工厂模式中每新增一个具体产品就需要修改工厂类内部的判断逻辑。为了不修改工厂类遵循开闭原则工厂方法模式中不再使用工厂类统一创建所有的具体产品而是针对不同的产品设计了不同的工厂每一个工厂只生产特定的产品。
工厂方法模式结构
从工厂方法模式简介中可以知道该模式有以下几种角色
UML类图
Version 2.0
接下来继续使用生产手机的例子来讲解该模式
一、定义抽象产品类AbstractProduct
Phone类手机类AbstractProduct
class Phone {public:virtual void make(void) 0;};
二、定义具体产品类
MiPhone类小米手机类Product1
class MiPhone : public Phone {public:MiPhone() {this->make();}virtual void make(void) {cout << "make xiaomi phone!" << endl;}};
IPhone类苹果手机类Product2
class IPhone : public Phone {public:IPhone() {this->make();} virtual void make(void) {cout << "make iphone!" << endl;}};
三、定义抽象工厂类AbstractFactory
AbstractFactory类生产不同产品的工厂的抽象类
class AbstractFactory {public:virtual Phone* makePhone(void) 0;};
四、定义具体工厂类
XiaoMiFactory类生产小米手机的工厂类ConcreteFactory1
class XiaoMiFactory : public AbstractFactory {public:virtual Phone* makePhone(void) {return new MiPhone();}};
AppleFactory类生产苹果手机的工厂类ConcreteFactory2
class AppleFactory : public AbstractFactory {public:virtual Phone* makePhone(void) {return new IPhone();}};
五、客户端
int main(int argc, char** argv) {AbstractFactory* miFactory new XiaoMiFactory();AbstractFactory* appleFactory new AppleFactory();Phone* miPhone miFactory->makePhone();Phone* iPhone appleFactory->makePhone();return 0;}
执行结果
make xiaomi phone!make iphone!
Version 2.1
扩展增加生产华为手机实现
一、扩展具体产品类
Huawei类华为手机类Product3
class HuaweiPhone : public Phone{public:HuaweiPhone() {this->make();}virtual void make(void) {cout << "make huawei phone!" << endl;}};
二、扩展具体工厂类
HuaweiFactory类生产华为手机的工厂类ConcreteFactory3
class HuaweiFactory : public AbstractFactory {public:virtual Phone* makePhone(void) {return new HuaweiPhone();}};
三、扩展客户端
int main(int argc, char** argv) {AbstractFactory* miFactory new XiaoMiFactory();AbstractFactory* appleFactory new AppleFactory();AbstractFactory* huaweiFactory new HuaweiFactory();Phone* miPhone miFactory->makePhone();Phone* iPhone appleFactory->makePhone();Phone* huaweiphone huaweiFactory->makePhone();return 0;}
执行结果
make xiaomi phone!make iphone!make huawei phone!
优点
缺点
适用场合
抽象工厂模式(Abstract Factory)
定义
提供一个创建一系列相关或相互依赖对象的接口而无需指定他们具体的类。
简言之一个工厂可以提供创建多种相关产品的接口而无需像工厂方法一样为每一个产品都提供一个具体工厂。
抽象工厂模式结构
抽象工厂模式结构与工厂方法模式结构类似不同之处在于一个具体工厂可以生产多种同类相关的产品
UML类图
Version 3.0
一、定义A类抽象产品类AbstractProductA
Phone类定义手机产品的接口(AbstractPhone)
class Phone {public:virtual void make(void) 0;};
二、定义具体A类产品类
MiPhone类小米手机类Product1
class MiPhone : public Phone {public:MiPhone() {this->make();}virtual void make(void) {cout << "make xiaomi phone!" << endl;}};
IPhone类苹果手机类Product2
class IPhone : public Phone {public:IPhone() {this->make();} virtual void make(void) {cout << "make iphone!" << endl;}};
三、定义B类抽象产品类 AbstractProductB
PC类定义PC产品的接口(AbstractPC)
class PC {public:virtual void make(void) 0;};
四、定义具体B类产品类
小米PC类定义小米电脑产品(MIPC)
class MiPC : public PC {public:MiPC() {this->make();}virtual void make(void) {cout << "make xiaomi PC!" << endl;}};
MAC类定义苹果电脑产品(MAC)
class MAC : public PC {public:MAC() {this->make();}virtual void make(void) {cout << "make MAC!" << endl;}};
五、定义抽象工厂AbstractFactory
AbstractFactory类
class AbstractFactory {public:virtual Phone* makePhone(void) 0;virtual PC* makePC(void) 0;};
六、定义具体工厂ConcreteProduct
XiaoMiFactory类小米工厂类ConcreteFactory1
class XiaoMiFactory : public AbstractFactory {public:virtual Phone* makePhone(void) {return new MiPhone();}virtual PC* makePC(void) {return new MiPC();}};
AppleFactory类苹果工厂类ConcreteFactory2
class AppleFactory : public AbstractFactory {public:virtual Phone* makePhone(void) {return new IPhone();}virtual PC* makePC(void) {return new MAC();}};
七、客户端
int main(int argc, char** argv) {AbstractFactory* miFactory new XiaoMiFactory();AbstractFactory* appleFactory new AppleFactory();Phone* miPhone miFactory->makePhone();PC* miPC miFactory->makePC();Phone* iPhone appleFactory->makePhone();PC* Mac appleFactory->makePC();return 0;}
执行结果
make xiaomi phone!make xiaomi PC!make iphone!make MAC!