Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Éè¼ÆÄ£Ê½Ö®³éÏ󹤳§Ä£Ê½(Abstract Factory)ժ¼
 
»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-07-01
 

ÃæÏò¶ÔÏóϵͳµÄ·ÖÎöºÍÉè¼ÆÊµ¼ÊÉÏ×·ÇóµÄ¾ÍÊÇÁ½µã£º¸ßÄÚ¾Û(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;
}

³éÏ󹤳§Ä£Ê½½á¹¹Í¼£º

   
´Îä¯ÀÀ       
Ïà¹ØÎÄÕÂ

ΪʲôҪ×ö³ÖÐø²¿Êð£¿
ÆÊÎö¡°³ÖÐø½»¸¶¡±£ºÎå¸öºËÐÄʵ¼ù
¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
³ÖÐø¼¯³É¹¤¾ßµÄÑ¡Ôñ-×°ÔØ
 
Ïà¹ØÎĵµ

³ÖÐø¼¯³É½éÉÜ
ʹÓÃHudson³ÖÐø¼¯³É
³ÖÐø¼¯³ÉÖ®-ÒÀÀµ¹ÜÀí
IPD¼¯³É²úÆ·¿ª·¢¹ÜÀí
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀí¡¢ÈÕ¹¹½¨Óë³ÖÐø¼¯³É
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
»ùÓÚAndroidµÄµ¥Ôª¡¢ÐÔÄܲâÊÔ


ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
Visitor Parttern
ÓÉ±í¼°À￴ģʽ
Éè¼ÆÄ£Ê½Ëæ±ÊϵÁÐ
ÉîÈëdz³öÉè¼ÆÄ£Ê½-½éÉÜ
.NETÖеÄÉè¼ÆÄ£Ê½

Ïà¹ØÅàѵ¿Î³Ì

J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Ó¦ÓÃģʽÉè¼ÆJavaÆóÒµ¼¶Ó¦ÓÃ
Éè¼ÆÄ£Ê½Ô­ÀíÓëÓ¦ÓÃ
J2EEÉè¼ÆÄ£Ê½Ö¸ÄÏ
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Éè¼ÆÄ£Ê½¼°ÆäCSharpʵÏÖ


ijµçÁ¦¹«Ë¾ Éè¼ÆÄ£Ê½Ô­Àí
À¶ÍØÆË Éè¼ÆÄ£Ê½Ô­Àí¼°Ó¦ÓÃ
ÎÀÐǵ¼º½ UML & OOAD
ÌÀɭ·͸Ñз¢ÖÐÐÄ UML& OOAD
Öдïµçͨ Éè¼ÆÄ£Ê½Ô­Àí
Î÷ÃÅ×Ó Ç¶ÈëʽÉè¼ÆÄ£Ê½
 
 
 
¡¡