设计模式之——工厂模式(FactoryMethodPattern)
2016-02-22 11:43
465 查看
工厂模式
简单工厂模式每次添加一个产品子类都必须在工厂类中添加一个判断分支,这样违背了开放-封闭原则,因此,工厂模式就是为了解决这个问题而产生的。
既然每次都要判断,那我就把这些判断都生成一个工厂子类,这样,每次添加产品子类的时候,只需再添加一个工厂子类就可以了。这样就完美的遵循了开放-封闭原则。但这其实也有问题,如果产品数量足够多,要维护的量就会增加,好在一般工厂子类只用来生成产品类,只要产品子类的名称不发生变化,那么基本工厂子类就不需要修改,每次只需要修改产品子类就可以了。
常用的场景
基本与简单工厂模式一致,只不过是改进了简单工厂模式中的开放-封闭原则的缺陷,使得模式更具有弹性。将实例化的过程推迟到子类中,由子类来决定实例化哪个。
优点:基本与简单工厂模式一致,多的一点优点就是遵循了开放-封闭原则,使得模式的灵活性更强。
缺点:与简单工厂模式差不多。
实例代码
简单工厂模式每次添加一个产品子类都必须在工厂类中添加一个判断分支,这样违背了开放-封闭原则,因此,工厂模式就是为了解决这个问题而产生的。
既然每次都要判断,那我就把这些判断都生成一个工厂子类,这样,每次添加产品子类的时候,只需再添加一个工厂子类就可以了。这样就完美的遵循了开放-封闭原则。但这其实也有问题,如果产品数量足够多,要维护的量就会增加,好在一般工厂子类只用来生成产品类,只要产品子类的名称不发生变化,那么基本工厂子类就不需要修改,每次只需要修改产品子类就可以了。
常用的场景
基本与简单工厂模式一致,只不过是改进了简单工厂模式中的开放-封闭原则的缺陷,使得模式更具有弹性。将实例化的过程推迟到子类中,由子类来决定实例化哪个。
优点:基本与简单工厂模式一致,多的一点优点就是遵循了开放-封闭原则,使得模式的灵活性更强。
缺点:与简单工厂模式差不多。
实例代码
//AbstractFactory.h #ifndef _ABSTRACTFACTORY_H_ #define _ABSTRACTFACTORY_H_ #include "AbstractProduct.h" class AbstractFactory { public: virtual AbstractProduct* CreateProduct()=0; }; class FactoryA :public AbstractFactory { public: AbstractProduct* CreateProduct(); }; class FactoryB :public AbstractFactory { public: AbstractProduct* CreateProduct(); }; #endif
//AbstractFactory.cpp #include "stdafx.h" #include "AbstractFactory.h" AbstractProduct* FactoryA::CreateProduct() { return new ProductA; } AbstractProduct* FactoryB::CreateProduct() { return new ProductB; }
//AbstractProduct.h #ifndef _ABSTRACTPRODUCT_H_ #define _ABSTRACTPRODUCT_H_ class AbstractProduct { public: virtual void Operation() = 0; }; class ProductA:public AbstractProduct { public: void Operation(); }; class ProductB:public AbstractProduct { public: void Operation(); }; #endif
//AbstractProduct.cpp #include "stdafx.h" #include "AbstractProduct.h" #include <iostream> using std::cout; using std::endl; void ProductA::Operation() { cout << "ProductA::Operation()" << endl; } void ProductB::Operation() { cout << "ProductB::Operation()" << endl; }
// FactoryMethodPattern.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include "AbstractFactory.h" int _tmain(int argc, _TCHAR* argv[]) { AbstractFactory* pFactory = new FactoryA; AbstractProduct* pProductA = pFactory->CreateProduct(); pProductA->Operation(); delete pProductA; pProductA = NULL; delete pFactory; pFactory = NULL; pFactory = new FactoryB; AbstractProduct* pProductB = pFactory->CreateProduct(); pProductB->Operation(); delete pProductB; pProductB = NULL; delete pFactory; pFactory = NULL; return 0; }
相关文章推荐
- 写在我第一个虚幻程序之前
- JVM调优总结(十二)-参考资料
- iOS/OS X 借助工具解决内存问题
- jQuery获取字符串中出现最多的数
- JAVA GC---新生代、老年代
- Android嵌入页面的碎片Fragment
- 证书失效 /苹果系统的安全证书过期
- 关于js跨域Access-Control-Allow-Origin问题
- Java 自动装箱与拆箱(Autoboxing and unboxing)
- JVM调优总结(十一)-反思
- Sql Server 里的向上取整、向下取整、四舍五入取整
- 《触动人心设计优秀iphone应用》读后感
- Linux挂载U盘
- 如何利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果
- java线程同步5种方式
- 并发无锁队列学习之二【单生产者单消费者】
- Android am 指令的使用
- 搭建持续集成接口测试平台(Jenkins+Ant+Jmeter)
- IT男的别样人生,爱折腾,竟然辞职跑丽江去了
- IT男的别样人生,爱折腾,竟然辞职跑丽江去了