| ÃæÏò¶ÔÏóϵͳµÄ·ÖÎöºÍÉè¼ÆÊµ¼ÊÉÏ×·ÇóµÄ¾ÍÊÇÁ½µã£º¸ßÄÚ¾Û(Cohesion)ºÍµÍñîºÏ(Coupling).
23ÖÖGOFÉè¼ÆÄ£Ê½Ò»°ã·ÖΪÈý´óÀࣺ´´½¨ÐÍģʽ¡¢½á¹¹ÐÍģʽ¡¢ÐÐΪģʽ¡£
´´½¨ÐÍģʽ°üÀ¨£º1¡¢FactoryMethod(¹¤³§·½·¨Ä£Ê½)£»2¡¢Abstract
Factory(³éÏ󹤳§Ä£Ê½)£»3¡¢Singleton(µ¥Àýģʽ)£»4¡¢Builder(½¨ÔìÕßģʽ)£»5¡¢Prototype(ÔÐÍģʽ).
½á¹¹ÐÍģʽ°üÀ¨£º6¡¢Bridge(ÇŽÓģʽ)£»7¡¢Adapter(ÊÊÅäÆ÷ģʽ)£»8¡¢Decorator(×°ÊÎģʽ)£»9¡¢Composite(×éºÏģʽ)£»10¡¢Flyweight(ÏíԪģʽ)£»11¡¢Facade(Íâ¹Ûģʽ)£»12¡¢Proxy(´úÀíģʽ).
ÐÐΪģʽ°üÀ¨£º13¡¢TemplateMethod(Ä£°å·½·¨Ä£Ê½)£»14¡¢Strategy(²ßÂÔģʽ)£»15¡¢State(״̬ģʽ)£»16¡¢Observer(¹Û²ìÕßģʽ)£»17¡¢Memento(±¸Íü¼ģʽ)£»18¡¢Mediator(ÖнéÕßģʽ)£»19¡¢Command(ÃüÁîģʽ)£»20¡¢Visitor(·ÃÎÊÕßģʽ)£»21¡¢Chain
of Responsibility(ÔðÈÎÁ´Ä£Ê½)£»22¡¢Iterator(µü´úÆ÷ģʽ)£»23¡¢Interpreter(½âÊÍÆ÷ģʽ).
Factory Method£º¶¨ÒåÒ»¸öÓÃÓÚ´´½¨¶ÔÏóµÄ½Ó¿Ú£¬ÈÃ×ÓÀà¾ö¶¨½«ÄÄÒ»¸öÀàʵÀý»¯¡£Factory
Methodʹһ¸öÀàµÄʵÀý»¯ÑÓ³Ùµ½Æä×ÓÀà¡£
Abstract Factory£ºÌṩһ¸ö´´½¨Ò»ÏµÁÐÏà¹Ø»òÏ໥ÒÀÀµ¶ÔÏóµÄ½Ó¿Ú£¬¶øÎÞÐèÖ¸¶¨ËûÃǾßÌåµÄÀà¡£
Singleton£º±£Ö¤Ò»¸öÀà½öÓÐÒ»¸öʵÀý£¬²¢Ìṩһ¸ö·ÃÎÊËüµÄÈ«¾Ö·ÃÎʵ㡣
Builder£º½«Ò»¸ö¸´ÔÓ¶ÔÏóµÄ¹¹½¨ÓëËüµÄ±íʾ·ÖÀ룬ʹµÃͬÑùµÄ¹¹½¨¹ý³Ì¿ÉÒÔ´´½¨²»Í¬µÄ±íʾ¡£
Prototype£ºÓÃÔÐÍʵÀýÖ¸¶¨´´½¨¶ÔÏóµÄÖÖÀ࣬²¢ÇÒͨ¹ý¿½±´Õâ¸öÔÐÍÀ´´´½¨ÐµĶÔÏó¡£
Bridge£º½«³éÏ󲿷ÖÓëËüµÄʵÏÖ²¿·Ö·ÖÀ룬ʹËüÃǶ¼¿ÉÒÔ¶ÀÁ¢µØ±ä»¯¡£
Adapter£º½«Ò»¸öÀàµÄ½Ó¿Úת»»³É¿Í»§Ï£ÍûµÄÁíÍâÒ»¸ö½Ó¿Ú¡£AdapterģʽʹµÃÔ±¾ÓÉÓÚ½Ó¿Ú²»¼æÈݶø²»ÄÜÒ»Æð¹¤×÷µÄÄÇЩÀà¿ÉÒÔÒ»Æð¹¤×÷¡£
Decorator£º¶¯Ì¬µØ¸øÒ»¸ö¶ÔÏóÌí¼ÓһЩ¶îÍâµÄÖ°Ôð¡£¾ÍÀ©Õ¹¹¦ÄܶøÑÔ£¬ Decoratorģʽ±ÈÉú³É×ÓÀ෽ʽ¸üΪÁé»î¡£
Composite£º½«¶ÔÏó×éºÏ³ÉÊ÷ÐνṹÒÔ±íʾ¡°²¿·Ö-ÕûÌ塱µÄ²ã´Î½á¹¹¡£CompositeʹµÃ¿Í»§¶Ôµ¥¸ö¶ÔÏóºÍ¸´ºÏ¶ÔÏóµÄʹÓþßÓÐÒ»ÖÂÐÔ¡£
Flyweight£ºÔËÓù²Ïí¼¼ÊõÓÐЧµØÖ§³Ö´óÁ¿Ï¸Á£¶ÈµÄ¶ÔÏó¡£
Facade£ºÎª×ÓϵͳÖеÄÒ»×é½Ó¿ÚÌṩһ¸öÒ»ÖµĽçÃæ£¬ Facadeģʽ¶¨ÒåÁËÒ»¸ö¸ß²ã½Ó¿Ú£¬Õâ¸ö½Ó¿ÚʹµÃÕâÒ»×Óϵͳ¸ü¼ÓÈÝÒ×ʹÓá£
Proxy£ºÎªÆäËû¶ÔÏóÌṩһ¸ö´úÀíÒÔ¿ØÖƶÔÕâ¸ö¶ÔÏóµÄ·ÃÎÊ¡£
Template Method£º¶¨ÒåÒ»¸ö²Ù×÷ÖеÄËã·¨µÄ¹Ç¼Ü£¬¶ø½«Ò»Ð©²½ÖèÑÓ³Ùµ½×ÓÀàÖС£Template
MethodʹµÃ×ÓÀà¿ÉÒÔ²»¸Ä±äÒ»¸öËã·¨µÄ½á¹¹¼´¿ÉÖØ¶¨Òå¸ÃËã·¨µÄÄ³Ð©ÌØ¶¨²½Öè¡£
Strategy£º¶¨ÒåһϵÁеÄËã·¨,°ÑËüÃÇÒ»¸ö¸ö·â×°ÆðÀ´, ²¢ÇÒʹËüÃÇ¿ÉÏà»¥Ìæ»»¡£±¾Ä£Ê½Ê¹µÃËã·¨µÄ±ä»¯¿É¶ÀÁ¢ÓÚʹÓÃËüµÄ¿Í»§¡£
State£ºÔÊÐíÒ»¸ö¶ÔÏóÔÚÆäÄÚ²¿×´Ì¬¸Ä±äʱ¸Ä±äËüµÄÐÐΪ¡£¶ÔÏó¿´ÆðÀ´ËƺõÐÞ¸ÄÁËËüËùÊôµÄÀà¡£
Observer£º¶¨Òå¶ÔÏó¼äµÄÒ»ÖÖÒ»¶Ô¶àµÄÒÀÀµ¹ØÏµ,ÒԱ㵱һ¸ö¶ÔÏóµÄ״̬·¢Éú¸Ä±äʱ,ËùÓÐÒÀÀµÓÚËüµÄ¶ÔÏ󶼵õ½Í¨Öª²¢×Ô¶¯Ë¢Ð¡£
Memento£ºÔÚ²»ÆÆ»µ·â×°ÐÔµÄǰÌáÏ£¬²¶»ñÒ»¸ö¶ÔÏóµÄÄÚ²¿×´Ì¬£¬²¢ÔڸöÔÏóÖ®Íâ±£´æÕâ¸ö״̬¡£ÕâÑùÒÔºó¾Í¿É½«¸Ã¶ÔÏó»Ö¸´µ½±£´æµÄ״̬¡£
Mediator£ºÓÃÒ»¸öÖнé¶ÔÏóÀ´·âװһϵÁеĶÔÏó½»»¥¡£ÖнéÕßʹ¸÷¶ÔÏó²»ÐèÒªÏÔʽµØÏ໥ÒýÓ㬴ӶøÊ¹ÆäñîºÏËÉÉ¢£¬¶øÇÒ¿ÉÒÔ¶ÀÁ¢µØ¸Ä±äËüÃÇÖ®¼äµÄ½»»¥¡£
Command£º½«Ò»¸öÇëÇó·âװΪһ¸ö¶ÔÏ󣬴ӶøÊ¹Äã¿ÉÓò»Í¬µÄÇëÇó¶Ô¿Í»§½øÐвÎÊý»¯£»¶ÔÇëÇóÅŶӻò¼Ç¼ÇëÇóÈÕÖ¾£¬ÒÔ¼°Ö§³Ö¿ÉÈ¡ÏûµÄ²Ù×÷¡£
Visitor£º±íʾһ¸ö×÷ÓÃÓÚij¶ÔÏó½á¹¹Öеĸ÷ÔªËØµÄ²Ù×÷¡£ËüʹÄã¿ÉÒÔÔÚ²»¸Ä±ä¸÷ÔªËØµÄÀàµÄǰÌá϶¨Òå×÷ÓÃÓÚÕâÐ©ÔªËØµÄвÙ×÷¡£
Chain of Responsibility£ºÎª½â³ýÇëÇóµÄ·¢ËÍÕߺͽÓÊÕÕßÖ®¼äñîºÏ£¬¶øÊ¹¶à¸ö¶ÔÏó¶¼Óлú»á´¦ÀíÕâ¸öÇëÇó¡£½«ÕâЩ¶ÔÏóÁ¬³ÉÒ»ÌõÁ´£¬²¢ÑØ×ÅÕâÌõÁ´´«µÝ¸ÃÇëÇó£¬Ö±µ½ÓÐÒ»¸ö¶ÔÏó´¦ÀíËü¡£
Iterator£ºÌṩһÖÖ·½·¨Ë³Ðò·ÃÎÊÒ»¸ö¾ÛºÏ¶ÔÏóÖи÷¸öÔªËØ, ¶øÓÖ²»Ð豩¶¸Ã¶ÔÏóµÄÄÚ²¿±íʾ¡£
Interpreter£º¸ø¶¨Ò»¸öÓïÑÔ, ¶¨ÒåËüµÄÎÄ·¨µÄÒ»ÖÖ±íʾ£¬²¢¶¨ÒåÒ»¸ö½âÊÍÆ÷, ¸Ã½âÊÍÆ÷ʹÓøñíʾÀ´½âÊÍÓïÑÔÖеľä×Ó¡£
Abstract Factory£º(1)¡¢Òâͼ£ºÌṩһ¸ö´´½¨Ò»ÏµÁÐÏà¹Ø»òÏ໥ÒÀÀµ¶ÔÏóµÄ½Ó¿Ú£¬¶øÎÞÐèÖ¸¶¨ËüÃǾßÌåµÄÀࣻ(2)¡¢ÊÊÓÃÐÔ£ºÒ»¸öϵͳҪ¶ÀÁ¢ÓÚËüµÄ²úÆ·µÄ´´½¨¡¢×éºÏºÍ±íʾʱ£»Ò»¸öϵͳҪÓɶà¸ö²úƷϵÁÐÖеÄÒ»¸öÀ´ÅäÖÃʱ£»µ±ÄãҪǿµ÷һϵÁÐÏà¹ØµÄ²úÆ·¶ÔÏóµÄÉè¼ÆÒÔ±ã½øÐÐÁªºÏʹÓÃʱ£»µ±ÄãÌṩһ¸ö²úÆ·Àà¿â£¬¶øÖ»ÏëÏÔʾËüÃǵĽӿڶø²»ÊÇʵÏÖʱ£»(3)¡¢ÓÅȱµã£ºËü·ÖÀëÁ˾ßÌåµÄÀࣻËüʹµÃÒ×ÓÚ½»»»²úƷϵÁУ»ËüÓÐÀûÓÚ²úÆ·µÄÒ»ÖÂÐÔ£»ÄÑÒÔÖ§³ÖÐÂÖÖÀàµÄ²úÆ·¡£
Abstract FactoryÀàͨ³£Óù¤³§·½·¨(Factory Method)ʵÏÖ£¬µ«ËüÃÇÒ²¿ÉÒÔÓÃPrototypeʵÏÖ¡£Ò»¸ö¾ßÌåµÄ¹¤³§Í¨³£ÊÇÒ»¸öµ¥¼þ(Singleton)¡£
ʾÀý´úÂë1£º
#include <string> #include <iostream> #include <vector> using namespace std; //Óû§³éÏó½Ó¿Ú class IUser { public: virtual void GetUser() = 0; virtual void InsertUser() = 0; }; //²¿ÃųéÏó½Ó¿Ú class IDepartment { public: virtual void GetDepartment() = 0; virtual void InsertDepartment() = 0; }; //ACCESS Óû§ class CAccessUser : public IUser { public: virtual void GetUser() { cout<<"Access GetUser"<<endl; } virtual void InsertUser() { cout<<"Access InsertUser"<<endl; } }; //ACCESS ²¿ÃÅ class CAccessDepartment : public IDepartment { public: virtual void GetDepartment() { cout<<"Access GetDepartment"<<endl; } virtual void InsertDepartment() { cout<<"Access InsertDepartment"<<endl; } }; //SQL Óû§ class CSqlUser : public IUser { public: virtual void GetUser() { cout<<"Sql User"<<endl; } virtual void InsertUser() { cout<<"Sql User"<<endl; } }; //SQL ²¿ÃÅ class CSqlDepartment : public IDepartment { public: virtual void GetDepartment() { cout<<"Sql GetDepartment"<<endl; } virtual void InsertDepartment() { cout<<"Sql InsertDepartment"<<endl; } }; //³éÏ󹤳§ class IFactory { public: virtual IUser* CreateUser() = 0; virtual IDepartment* CreateDepartment() = 0; }; //ACCESS ¹¤³§ class AccessFactory : public IFactory { public: virtual IUser* CreateUser() { return new CAccessUser(); } virtual IDepartment* CreateDepartment() { return new CAccessDepartment(); } }; //SQL ¹¤³§ class SqlFactory : public IFactory { public: virtual IUser* CreateUser() { return new CSqlUser(); } virtual IDepartment* CreateDepartment() { return new CSqlDepartment(); } }; //¿Í»§¶Ë int main() { IFactory* factory = new SqlFactory(); IUser* user = factory->CreateUser(); IDepartment* depart = factory->CreateDepartment(); user->GetUser(); depart->GetDepartment(); /*result: Sql User Sql GetDepartment */ return 0; } |
ʾÀý´úÂë2£º
abstractFactory.h:
#ifndef _ABSTRACTFACTORY_H_ #define _ABSTRACTFACTORY_H_ class AbstractProductA; class AbstractProductB; class AbstractFactory { public: virtual ~AbstractFactory(); virtual AbstractProductA* CreateProductA() = 0; virtual AbstractProductB* CreateProductB() = 0; protected: AbstractFactory(); private: }; class ConcreteFactory1 : public AbstractFactory { public: ConcreteFactory1(); ~ConcreteFactory1(); AbstractProductA* CreateProductA(); AbstractProductB* CreateProductB(); protected: private: }; class ConcreteFactory2 : public AbstractFactory { public: ConcreteFactory2(); ~ConcreteFactory2(); AbstractProductA* CreateProductA(); AbstractProductB* CreateProductB(); protected: private: }; #endif//~_ABSTRACTFACTORY_H_ |
abstractFactory.cpp:
#include "abstractFactory.h" #include "product.h" #include <iostream> using namespace std; AbstractFactory::AbstractFactory() { } AbstractFactory::~AbstractFactory() { } ConcreteFactory1::ConcreteFactory1() { } ConcreteFactory1::~ConcreteFactory1() { } AbstractProductA* ConcreteFactory1::CreateProductA() { return new ProductA1(); } AbstractProductB* ConcreteFactory1::CreateProductB() { return new ProductB1; } ConcreteFactory2::ConcreteFactory2() { } ConcreteFactory2::~ConcreteFactory2() { } AbstractProductA* ConcreteFactory2::CreateProductA() { return new ProductA2(); } AbstractProductB* ConcreteFactory2::CreateProductB() { return new ProductB2(); } |
product.h:
#ifndef _PRODUCT_H_ #define _PRODUCT_H_ class AbstractProductA { public: virtual ~AbstractProductA(); protected: AbstractProductA(); private: }; class AbstractProductB { public: virtual ~AbstractProductB(); protected: AbstractProductB(); private: }; class ProductA1 : public AbstractProductA { public: ProductA1(); ~ProductA1(); protected: private: }; class ProductA2 : public AbstractProductA { public: ProductA2(); ~ProductA2(); protected: private: }; class ProductB1 : public AbstractProductB { public: ProductB1(); ~ProductB1(); protected: private: }; class ProductB2 : public AbstractProductB { public: ProductB2(); ~ProductB2(); protected: private: }; #endif//~_PRODUCT_H_ |
product.cpp:
#include "product.h" #include <iostream> using namespace std; AbstractProductA::AbstractProductA() { } AbstractProductA::~AbstractProductA() { } AbstractProductB::AbstractProductB() { } AbstractProductB::~AbstractProductB() { } ProductA1::ProductA1() { cout<<"ProductA1 ..."<<endl; }; ProductA1::~ProductA1() { } ProductA2::ProductA2() { cout<<"ProductA2 ..."<<endl; } ProductA2::~ProductA2() { } ProductB1::ProductB1() { cout<<"ProductB1 ..."<<endl; } ProductB1::~ProductB1() { } ProductB2::ProductB2() { cout<<"ProductB2 ..."<<endl; } ProductB2::~ProductB2() { } |
main.cpp:
#include "abstractFactory.h" #include <iostream> using namespace std; int main() { AbstractFactory* cf1 = new ConcreteFactory1(); cf1->CreateProductA(); cf1->CreateProductB(); AbstractFactory* cf2 = new ConcreteFactory2(); cf2->CreateProductA(); cf2->CreateProductB(); /*result: ProductA1 ... ProductB1 ... ProductA2 ... ProductB2 ... */ return 0; } |
³éÏ󹤳§Ä£Ê½½á¹¹Í¼£º

|