设计模式学习笔记(二)—工厂方法模式

  • 概念

工厂方法模式是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。

  • 优缺点

优点:

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.\n");
15 }
16 
17 void CSqlServer::Update()
18 {
19     printf("SqlServer Update Function.\n");
20 }
21 
22 void CSqlServer::Delete()
23 {
24     printf("SqlServer Delete Function.\n");
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.\n");
15 }
16 
17 void COracle::Update()
18 {
19     printf("Oracle Update Function.\n");
20 }
21 
22 void COracle::Delete()
23 {
24     printf("Oracle Delete Function.\n");
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.\n");
15 }
16 
17 void CMySql::Update()
18 {
19     printf("MySql Update Function.\n");
20 }
21 
22 void CMySql::Delete()
23 {
24     printf("MySql Delete Function.\n");
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 }

输出结果:

 

posted @ 2016-08-03 15:27  灯火阑珊231  阅读(243)  评论(0编辑  收藏  举报