zoukankan      html  css  js  c++  java
  • 设计模式学习笔记(二)—工厂方法模式

    • 概念

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

    • 优缺点

    优点:

    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 }

    输出结果:

  • 相关阅读:
    PullToRefreshListView中嵌套ViewPager滑动冲突的解决
    Google图片加载库Glide的简单封装GlideUtils
    Gallery滑动一页(一个Item)效果
    Android App中使用Gallery制作幻灯片播放效果
    Android中Gallery和ImageSwitcher同步自动(滚动)播放图片库
    Android 使用Gallery组件实现图片播放预览
    Android 使用自定义Dialog打造ActionSheet菜单
    再谈Ubuntu和CentOS安装好之后的联网问题(桥接和NAT、静态和动态ip)(博主推荐)
    Weka中数据挖掘与机器学习系列之Weka Package Manager安装所需WEKA的附加算法包出错问题解决方案总结(八)
    Weka中数据挖掘与机器学习系列之Weka3.7和3.9不同版本共存(七)
  • 原文地址:https://www.cnblogs.com/dhls231/p/5688691.html
Copyright © 2011-2022 走看看