php技术的网站建设实录方案,怎样做网站权重,做一个网站需要服务器吗,wordpress定时发布失败处理设计模式的目的就是尽量减少“变化”对程序的影响#xff0c;尤其是对客户程序的影响。AbstractFactory模式作为创建型模式的一种#xff0c;解决的就是“new”在变化中可能引起的问题。 先来看看new有何种不好#xff0c;举个创建汽车的车门的例子#xff1a; 很自然的一…
设计模式的目的就是尽量减少“变化”对程序的影响尤其是对客户程序的影响。AbstractFactory模式作为创建型模式的一种解决的就是“new”在变化中可能引起的问题。 先来看看new有何种不好举个创建汽车的车门的例子 很自然的一种想法是Door *door new Door(); 但是如果遇到创建老爷车的车门创建现代车的车门这段代码就无所适从了。 OO为我们提供了哪些精华的思想“封装”是的将车门的创建封装起来于是我们有了静态工厂方法 客户程序代码 1Door* door doorFactory-CreateDoor();库程序代码 1class DoorFactory 2{ 3public: 4 Door* CreateDoor() 5 { 6 return new Door(); 7 } 8}客户程序在此是不会变化的不管你是老爷车门现代车门还是钻石车门这些和客户程序代码都是没关系的究竟CreateDoor出来如何结果都交给多态来判断我们不用操心。 但是库程序代码还是需要更改的但我们已经将“变化”与客户程序隔离了。 需求又有变化了不光要创建车门还需要创建引擎车灯而且还是不同风格的。 这时候静态工厂已经应付不来了静态工厂有其自身的缺陷“不能应对不同系列对象”的变化。 动机 软件系统中经常面临“一系列相互依赖的对象”的创建工作。两个特征“一系列”“相互依赖” 将创建过程封装起来避免“客户程序”和“多系列具体对象的创建工作”的紧耦合。 意图 提供一个接口让该接口负责创建一系列“相关或者相互依赖的对象”无需指定他们具体的类。GoF23 思路 对于客户程序来说只依赖于三个抽象的类AbstractFactoryAbstractProductAAbstractProductB。 以下是客户程序代码 1class CarManager 2{ 3protected: 4 AbstractFactory *abstractFactory; 5public: 6 //创造Car 7 void createCar(AbstractFactory *abstractFactory) 8 { 9 abstractFactory-CreateEngine(); 10 abstractFactory-CreateDoor(); 11 abstractFactory-CreateLight(); 12 } 13 //其他的操作 14 void run(){} 15}; 16 17int _tmain(int argc, _TCHAR* argv[]) 18{ 19 CarManager *carManager new CarManager(); 20 //创建Classic风格的汽车 21 carManager-createCar(new ClassicFactory()); 22 23 return 0; 24}所有关于创建的操作都是用抽象类完成的对于具体是何种类型的对象由多态实现以此来使“客户代码”和“多系列具体对象的创建工作”达到松耦合。 如果遇到还需要扩展其他风格的汽车可以按下图的思路 红色的部分对应新风格的车辆只需在库程序中添加ConcreteFactory3,ProductA3,ProductB3三个类而对于客户代码CarManager来说完全不受影响。 总结 AbstractFactory模式有以下三个要点 1.应对的问题是“多风格的系列对象创建”的变化问题“系列对象”指的是这些对象之间有相互依赖或者相互作用的关系。否则使用“静态工厂”足以。 2.抽象工厂和静态工厂的核心是“封装”将对象的创建进行封装避免“new”引起的问题 3.抽象工程的另一个核心是“多态”通过动态绑定来处理“不同风格”的问题 注 AbstractFactory模式主要针对“风格”的变化如果“对象”本身经常变化那么该模式并不适用。 自己做的示例代码仅供参考 1// 2// AbstractFactoryTest for AbstractFactory Pattern Test 3// 4// 5 6#include stdafx.h 7#include iostream 8using namespace std; 9 10//Engine,Door,Light are the Abstract Product 11//这三个类对应UML图中的AbstractProduct类 12class Engine 13{ 14public: 15 Engine() 16 { 17 coutAbstract Engine Createendl; 18 } 19 virtual void doSomething() 0; 20}; 21 22class Door 23{ 24public: 25 Door() 26 { 27 coutAbstract Door Createendl; 28 } 29 virtual void doSomething() 0; 30}; 31 32class Light 33{ 34public: 35 Light() 36 { 37 coutAbstract Light Createendl; 38 } 39 virtual void doSomething() 0; 40}; 41 42//Abstract Factory 43class AbstractFactory 44{ 45public: 46 AbstractFactory() 47 { 48 coutAbstractFactory Createendl; 49 } 50 virtual Engine* CreateEngine() 0; 51 virtual Door* CreateDoor() 0; 52 virtual Light* CreateLight() 0; 53}; 54 55//SpeedEngine,SpeedDoor,SpeedLight are the Products of Speed Style 56//这三个类对应UML图中的ProductA1ProductB1ProductC1类 57class SpeedEngine:public Engine 58{ 59public : 60 SpeedEngine() 61 { 62 coutSpeed Engine Createendl; 63 } 64 void doSomething(){ } 65}; 66 67class SpeedDoor:public Door 68{ 69public : 70 SpeedDoor() 71 { 72 coutSpeed Door Createendl; 73 } 74 void doSomething(){ } 75}; 76 77class SpeedLight:public Light 78{ 79public : 80 SpeedLight() 81 { 82 coutSpeed Light Createendl; 83 } 84 void doSomething(){ } 85}; 86 87//classicEngine,classicDoor,classicLight are the products of Classic style 88//这三个类对应UML图中的ProductA2ProductB2ProductC2类 89class ClassicEngine:public Engine 90{ 91public : 92 ClassicEngine() 93 { 94 coutClassic Engine Createendl; 95 } 96 void doSomething(){ } 97}; 98 99class ClassicDoor:public Door 100{ 101public : 102 ClassicDoor() 103 { 104 coutClassic Door Createendl; 105 } 106 void doSomething(){ } 107}; 108 109class ClassicLight:public Light 110{ 111public : 112 ClassicLight() 113 { 114 coutClassic Light Createendl; 115 } 116 void doSomething(){ } 117}; 118 119//Factory for Speed Cars 120//对应UML图中的ConcreteFactory1类 121class SpeedFactory:public AbstractFactory 122{ 123public: 124 SpeedFactory() 125 { 126 coutSpeedFactory Createendl; 127 } 128 virtual Engine* CreateEngine() 129 { 130 return new SpeedEngine(); 131 } 132 virtual Door* CreateDoor() 133 { 134 return new SpeedDoor(); 135 } 136 virtual Light* CreateLight() 137 { 138 return new SpeedLight(); 139 } 140}; 141 142//Factory for classic Cars 143//对应UML图中的ConcreteFactory2类 144class ClassicFactory:public AbstractFactory 145{ 146public: 147 ClassicFactory() 148 { 149 coutClassicFactory Createendl; 150 } 151 virtual Engine* CreateEngine() 152 { 153 return new ClassicEngine(); 154 } 155 virtual Door* CreateDoor() 156 { 157 return new ClassicDoor(); 158 } 159 virtual Light* CreateLight() 160 { 161 return new ClassicLight(); 162 } 163}; 164 165//Client Code ---- use the Abstract Factory Abstract Product to create the car 166//this is never changed 167class CarManager 168{ 169protected: 170 AbstractFactory *abstractFactory; 171public: 172 //创造Car 173 void createCar(AbstractFactory *abstractFactory) 174 { 175 abstractFactory-CreateEngine(); 176 abstractFactory-CreateDoor(); 177 abstractFactory-CreateLight(); 178 } 179 //其他的操作 180 void run(){} 181}; 182 183int _tmain(int argc, _TCHAR* argv[]) 184{ 185 CarManager *carManager new CarManager(); 186 //创建Classic风格的汽车 187 carManager-createCar(new ClassicFactory()); 188 189 return 0; 190}