-
概念
工厂方法模式是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。
-
优缺点
优点:
1、 工厂方法模式中,客户端只需要知道所要产品的具体工厂,不用关心具体的创建过程,甚至不需要知道具体产品类的类名。
2、 当我们新增产品的时候,我们只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。
缺点:
1、 由于每次增加一个产品,我们都需要增加一个具体类和对象实现工厂,当我们增加的产品比较多得时候,这样类的个数也就成倍的增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
-
实现
下面我们通过一个具体的例子来更好的了解工厂方法模式。
说明:
常用的数据库有SQL Server、Oracle、MySql、Access、Sybase等。他们中有很多共通的方法,如:insert,update,delete,select等等,这里我们就可以用一个工厂方法模式来实现。首先我们设计一个产品接口类IDataBase(就是四个角色里面的抽象产品角色),然后是三个具体产品实现类(具体产品角色):CSqlServer、COracle、CMySql,各个实现类实现自己通用语法下面的各个方法。然后是我们的抽象工厂接口类(抽象工厂角色):IDataBaseFactory。最后就是我们的具体工厂类(具体工厂角色):CSqlServerFactory、COracleFactory、CMySqlFactory。
类图:
实现代码:
IDataBase.h:
1 class IDataBase 2 { 3 public: 4 IDataBase(void); 5 virtual ~IDataBase(void); 6 7 virtual void Insert() = 0; 8 virtual void Update() = 0; 9 virtual void Delete() = 0; 10 };
SqlServer.h
1 #pragma once 2 #include "IDataBase.h" 3 4 class CSqlServer : public IDataBase 5 { 6 public: 7 CSqlServer(void); 8 virtual ~CSqlServer(void); 9 10 virtual void Insert(); 11 virtual void Update(); 12 virtual void Delete(); 13 };
SqlServer.cpp
1 #include "StdAfx.h" 2 #include "SqlServer.h" 3 4 CSqlServer::CSqlServer(void) 5 { 6 } 7 8 CSqlServer::~CSqlServer(void) 9 { 10 } 11 12 void CSqlServer::Insert() 13 { 14 printf("SqlServer Insert Function. "); 15 } 16 17 void CSqlServer::Update() 18 { 19 printf("SqlServer Update Function. "); 20 } 21 22 void CSqlServer::Delete() 23 { 24 printf("SqlServer Delete Function. "); 25 }
Oracle.h
1 #pragma once 2 #include "IDataBase.h" 3 4 class COracle : public IDataBase 5 { 6 public: 7 COracle(void); 8 ~COracle(void); 9 10 virtual void Insert(); 11 virtual void Update(); 12 virtual void Delete(); 13 };
Oracle.cpp
1 #include "StdAfx.h" 2 #include "Oracle.h" 3 4 COracle::COracle(void) 5 { 6 } 7 8 COracle::~COracle(void) 9 { 10 } 11 12 void COracle::Insert() 13 { 14 printf("Oracle Insert Function. "); 15 } 16 17 void COracle::Update() 18 { 19 printf("Oracle Update Function. "); 20 } 21 22 void COracle::Delete() 23 { 24 printf("Oracle Delete Function. "); 25 }
MySql.h
1 #pragma once 2 #include "IDataBase.h" 3 4 class CMySql : public IDataBase 5 { 6 public: 7 CMySql(void); 8 ~CMySql(void); 9 10 virtual void Insert(); 11 virtual void Update(); 12 virtual void Delete(); 13 };
MySql.cpp
1 #include "StdAfx.h" 2 #include "MySql.h" 3 4 CMySql::CMySql(void) 5 { 6 } 7 8 CMySql::~CMySql(void) 9 { 10 } 11 12 void CMySql::Insert() 13 { 14 printf("MySql Insert Function. "); 15 } 16 17 void CMySql::Update() 18 { 19 printf("MySql Update Function. "); 20 } 21 22 void CMySql::Delete() 23 { 24 printf("MySql Delete Function. "); 25 }
IDataBaseFactory.h
1 #pragma once 2 #include "IDataBase.h" 3 4 class IDataBaseFactory 5 { 6 public: 7 IDataBaseFactory(void); 8 ~IDataBaseFactory(void); 9 10 virtual IDataBase* CreateInstance() = 0; 11 };
SqlServerFactory.h
1 #pragma once 2 #include "IDataBaseFactory.h" 3 4 class CSqlServerFactory : public IDataBaseFactory 5 { 6 public: 7 CSqlServerFactory(void); 8 ~CSqlServerFactory(void); 9 10 virtual IDataBase* CreateInstance(); 11 };
SqlServerFactory.cpp
1 #include "StdAfx.h" 2 #include "SqlServerFactory.h" 3 #include "SqlServer.h" 4 5 CSqlServerFactory::CSqlServerFactory(void) 6 { 7 } 8 9 CSqlServerFactory::~CSqlServerFactory(void) 10 { 11 } 12 13 IDataBase* CSqlServerFactory::CreateInstance() 14 { 15 return new CSqlServer(); 16 }
OracleFactory.h
1 #pragma once 2 #include "IDataBaseFactory.h" 3 4 class COracleFactory : public IDataBaseFactory 5 { 6 public: 7 COracleFactory(void); 8 ~COracleFactory(void); 9 10 virtual IDataBase* CreateInstance(); 11 };
OracleFactory.cpp
1 #include "StdAfx.h" 2 #include "OracleFactory.h" 3 #include "Oracle.h" 4 5 COracleFactory::COracleFactory(void) 6 { 7 } 8 9 COracleFactory::~COracleFactory(void) 10 { 11 } 12 13 IDataBase* COracleFactory::CreateInstance() 14 { 15 return new COracle(); 16 }
MySqlFactory.h
1 #pragma once 2 #include "IDataBaseFactory.h" 3 4 class CMySqlFactory : public IDataBaseFactory 5 { 6 public: 7 CMySqlFactory(void); 8 ~CMySqlFactory(void); 9 10 virtual IDataBase* CreateInstance(); 11 };
MySqlFactory.cpp
1 #include "StdAfx.h" 2 #include "MySqlFactory.h" 3 #include "MySql.h" 4 5 CMySqlFactory::CMySqlFactory(void) 6 { 7 } 8 9 CMySqlFactory::~CMySqlFactory(void) 10 { 11 } 12 13 IDataBase* CMySqlFactory::CreateInstance() 14 { 15 return new CMySql(); 16 }
main函数:
1 #include "stdafx.h" 2 #include "stdlib.h" 3 #include "IDataBase.h" 4 #include "IDataBaseFactory.h" 5 #include "MySql.h" 6 #include "Oracle.h" 7 #include "SqlServer.h" 8 #include "MySqlFactory.h" 9 #include "OracleFactory.h" 10 #include "SqlServerFactory.h" 11 12 void TestMySql() 13 { 14 IDataBaseFactory *pDataBaseFactory = new CMySqlFactory(); 15 IDataBase *pDataBase = pDataBaseFactory->CreateInstance(); 16 17 pDataBase->Insert(); 18 pDataBase->Update(); 19 pDataBase->Delete(); 20 21 delete pDataBase; 22 delete pDataBaseFactory; 23 } 24 25 void TestSqlServer() 26 { 27 IDataBaseFactory *pDataBaseFactory = new CSqlServerFactory(); 28 IDataBase *pDataBase = pDataBaseFactory->CreateInstance(); 29 30 pDataBase->Insert(); 31 pDataBase->Update(); 32 pDataBase->Delete(); 33 34 delete pDataBase; 35 delete pDataBaseFactory; 36 } 37 38 void TestOracle() 39 { 40 IDataBaseFactory *pDataBaseFactory = new COracleFactory(); 41 IDataBase *pDataBase = pDataBaseFactory->CreateInstance(); 42 43 pDataBase->Insert(); 44 pDataBase->Update(); 45 pDataBase->Delete(); 46 47 delete pDataBase; 48 delete pDataBaseFactory; 49 } 50 51 int _tmain(int argc, _TCHAR* argv[]) 52 { 53 TestMySql(); 54 TestSqlServer(); 55 TestOracle(); 56 57 system("pause"); 58 return 0; 59 }
输出结果: