常见设计模式的解析和实现常见设计模式的解析和实现(C++)之一-Factory模式作用:定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。UML结构图:抽象基类:1)Product:创建出来的对象的抽象基类.2)Factory创建对象的工厂方法的抽象基类.接口函数:l)Creator::FactoryMethod:纯虚函数,由派生类实现,创建出对应的Product.解析:在这个模式中,有两个抽象基类,一个是Product为创建出来的对象的抽象基类,一个是Factory是工厂的抽象基类,在互相协作的时候都是由相应的Factory派生类来生成Product的派生类,也就是说如果要新增一种Product那么也要对应的新增一个Factory,创建的过程委托给了这个Factory.也就是说一个Factory和一个Product是一一对应的关系.备注:设计模式的演示图上把Factory类命名为Creator,下面的实现沿用了这个命名.演示实现://Factory.cpp//factory模式演示#includeiostreamusingnamespacestd;classProduct{public:Product(){}virtual~Product(){}};classConcreteProduct:publicProduct{public:ConcreteProduct(){coutconstructionofConcreteProductendl;}virtual~ConcreteProduct(){coutdestructionofConcreteProductendl;}};classCreator{public:Creator(){}virtual~Creator(){}voidAnOperation(){Product*p=FactoryMethod();coutanoperationofproductendl;}protected:virtualProduct*FactoryMethod()=0;};classConcreteCreator:publicCreator{public:ConcreteCreator(){coutconstructionofConcreteCreatorendl;}virtual~ConcreteCreator(){coutdestructionofConcreteCreatorendl;}protected:virtualProduct*FactoryMethod(){returnnewConcreteProduct();}};intmain(){Creator*p=newConcreteCreator();p-AnOperation();deletep;return0;}常见设计模式的解析和实现(C++)之二-AbstractFactory模式作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。UML结构图:抽象基类:1)ProductA,ProductB:分别代表不同类型的产品,而它们的派生类则是这种产品的一个实现.2)AbstractFactory:生产这一系列产品的一个抽象工厂,它的派生类是不同的实现.接口函数:1)AbstractFactory::CreateProductA和AbstractFactory::CreateProductB:分别是生产不同产品的不同的实现,由各个派生出来的抽象工厂实现之.解析:AbstractFactory模式和Factory最大的差别就是抽象工厂创建的是一系列相关的对象,其中创建的实现其实采用的就是Factory模式的方法,对于某个实现的有一个派生出来的抽象工厂,另一个实现有另一个派生出来的工厂,等等.可以举一个简单的例子来解释这个模式:比如,同样是鸡腿(ProductA)和汉堡(ProdUctB),它们都可以有商店出售(AbstractFactory),但是有不同的实现,有肯德基(COncreateFactoryl)和麦当劳(ConcreateFactory2)两家生产出来的不同风味的鸡腿和汉堡(也就是ProductA和ProductB的不同实现),而负责生产汉堡和鸡腿的就是之前提过的Factory模式了.抽象工厂需要特别注意的地方就是区分不同类型的产品和这些产品的不同实现.显而易见的,如果有n种产品同时有m中不同的实现,那么根据乘法原理可知有n*m个Factory模式的使用.实现://abstract_factory.cpp#includeiostreamusingnamespacestd;//抽象基类AbstractProductA,代表产品A的抽象classAbstractProductA{public:AbstractProductA(){}virtual~AbstractProductA(){}};//派生类ConcreateProductAl,继承自AbstractProductA,代表产品A的第一种实现classConcreateProductA1:publicAbstractProductA{public:ConcreateProductA1(){coutConcreateProdcutA1endl;}virtual~ConcreateProductA1(){}};//派生类ConcreateProductA2,继承自AbstractProductA,代表产品A的第二种实现classConcreateProductA2:publicAbstractProductA{public:ConcreateProductA2(){coutConcreateProductA2endl;}virtual~ConcreateProductA2(){}};//抽象基类AbstractProductB,代表产品B的抽象classAbstractProductB{public:AbstractProductB(){}virtual~AbstractProductB(){}};//派生类ConcreateProductB1,继承自AbstractProductB,代表产品B的第一种实现classConcreateProductB1:publicAbstractProductB{public:ConcreateProductB1(){coutConcreateProductB1endl;}virtual~ConcreateProductB1(){}};//派生类ConcreateProductB2,继承自AbstractProductB,代表产品B的第二种实现classConcreateProductB2:publicAbstractProductB{public:ConcreateProductB2(){coutConcreateProductB2endl;}virtual~ConcreateProductB2(){}};//抽象基类AbstractFactory,工厂的抽象类,生产产品A和产品BclassAbstractFactory{public:AbstractFactory(){}virtual~AbstractFactory(){}virtualAbstractProductA*CreateProductA()=0;virtualAbstractProductB*CreateProductB()=0;};//派生类ConcreateFactoryl,继承自AbstractFactory,生产产品A和产品B的第一种实现classConcreteFactory1:publicAbstractFactory{public:ConcreteFactory1(){coutConcreteFactory1endl;}virtual~ConcreteFactory1(){}virtualAbstractProductA*CreateProductA(){returnnewConcreateProductA1();}virtualAbstractProductB*CreateProductB(){returnnewConcreateProductB1();}};//派生类ConcreateFactory2,继承自AbstractFactory生产产品A和产品B的第二种实现classConcreteFactory2:publicAbstractFactory{public:ConcreteFactory2(){coutConcreteFactory2endl;}virtual~ConcreteFactory2(){}virtualAbstractProductA*CreateProductA(){returnnewConcreateProductA2();}virtualAbstractProductB*CreateProductB(){returnnewConcreateProductB2();}};intmain(){//生产产品A的第一种实现AbstractFactory*cf1=newConcreteFactory1();cf1-CreateProductA();//生产产品B的第二种实现AbstractFactory*cf2=newConcreteFactory2();cf2-CreateProductB();deletecf1;deletecf2;return0;}常见设计模式的解析和实现(C++)之三-Builder模式作用:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示UML结构图:适用于以下情况:1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。2)当构造过程必须允许被构造的对象有不同的表示时。抽象基类:1)Builder:这个基类是全部创建对象过程的抽象,提供构建不同组成部分的接口函数接口:1)Builder::BuildPartA,Builder::BuildPartB:是对一个对象不同部分的构建函数接口,Builder的派生类来具体实现.另外还有一个需要注意的函数,就是Director::Construct函数,这个函数里面通过调用上面的两个接口函数完成对象的构建--也就是说各个不同部分装配的过程都是一致的(同样的调用的Construct函数),但是不同的构建方式会有不同的表示(根据Builder的实际类型来决定如何构建,也就是多态)解析:Builder模式是基于这样的一个情况:一个对象可能有不同的组成部分,这几个部分的不同的创建对象会有不同的表示,但是各个部分之间装配的方式是一致的.比方说一辆单车,都是由车轮车座等等的构成的(一个对象不同的组成部分),不同的品牌生产出来的也不一样(不同的构建方式).虽然不同的品牌构建出来的单车不同,但是构建的过程还是一样的(哦,你见过车轮长在车座上的么?).也就是说,Director::Construct函数中固定了各个组成部分的装配方式,而具体是装配怎样的组成部分由Builder的派生类实现.实现:Builder模式的实现基于以下几个面向对象的设计原则:1)把变化的部分提取出来形成一个基类和对应的接口函数,在这里不会变化的是都会创建PartA和PartB,变化的则是不同的创建方法,于是就抽取出这里的Builder基类和BuildPartA,BuildPartB接口函数2)采用聚合的方式聚合了会发生变化的基类,就是这里Director聚合了Builder类的指针.#includeiostreamusingnamespacestd;//虚拟基类,是所有Builder的基类,提供不同部分的构建接口函数classBuilder{public:Builder(