zoukankan      html  css  js  c++  java
  • 大话设计模式-简单工厂模式、工厂方法模式、抽象工厂模式

    简单工厂模式

    概念:简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

    适合应用于具有多个分支,不同的情况需要生成对应的类,将分支移到工厂类中,减少客户端的复杂度。但如果要新添加一个产品类的话,需要修改工厂类的代码。

     1 // OperationFactory.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include <iostream>
     6 #include <string>
     7 using namespace std;
     8 
     9 class Operation{
    10 private:
    11     int numberA;
    12     int numberB;
    13 public:
    14     void setNumberA(int a){
    15         this->numberA = a;
    16     }
    17     void setNumberB(int b){
    18         this->numberB = b;
    19     }
    20     int getNumberA(){
    21         return numberA;
    22     }
    23     int getNumberB(){
    24         return numberB;
    25     }
    26     virtual int getResult()=0;
    27 };
    28 
    29 class OperationAdd:public Operation{
    30 public:
    31     int getResult(){
    32         return (getNumberA() + getNumberB());
    33     }
    34 };
    35 class OperationSub:public Operation{
    36 public:
    37     int getResult(){
    38         return (getNumberA() - getNumberB());
    39     }
    40 };
    41 class OperationMul:public Operation{
    42 public:
    43     int getResult(){
    44         return (getNumberA() * getNumberB());
    45     }
    46 };
    47 class OperationDiv:public Operation{
    48 public:
    49     int getResult(){
    50         return (getNumberA() / getNumberB());
    51     }
    52 };
    53 
    54 class OperationFactory{
    55 public:
    56      Operation* createOperation(char ch){
    57         Operation *p = NULL;
    58         switch(ch){
    59         case '+':
    60             p = new OperationAdd();
    61             break;
    62         case '-':
    63             p = new OperationSub();
    64             break;
    65         case '*':
    66             p = new OperationMul();
    67             break;
    68         case '/':
    69             p = new OperationDiv();
    70             break;
    71         }
    72         return p;
    73     }
    74      //单例模式
    75      static OperationFactory & getInstance(){
    76          static OperationFactory of;
    77          return of;
    78      }
    79 };
    80 int _tmain(int argc, _TCHAR* argv[])
    81 {
    82     Operation *p;
    83     p = OperationFactory::getInstance().createOperation('+');
    84     p->setNumberA(2);
    85     p->setNumberB(3);
    86     cout << p->getResult()<< endl;
    87     return 0;
    88 }

     简单工厂模式在遇到新的类添加时,需要对工厂类进行修改,这未被了开放-封闭原则。

    工厂方法模式:

    概念:定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使得一个类的实例化延迟到其子类。

    工厂方法模式是简单工厂模式的进一步抽象和推广,使用了多态性,保持了简单工厂模式的有点,也克服简单工厂模式的缺点。但是每增加一个类,就要对应的增加该类的工厂类。

      1 // OperationFactory.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include <iostream>
      6 #include <string>
      7 using namespace std;
      8 
      9 class Operation{
     10 private:
     11     int numberA;
     12     int numberB;
     13 public:
     14     void setNumberA(int a){
     15         this->numberA = a;
     16     }
     17     void setNumberB(int b){
     18         this->numberB = b;
     19     }
     20     int getNumberA(){
     21         return numberA;
     22     }
     23     int getNumberB(){
     24         return numberB;
     25     }
     26     virtual int getResult()=0;
     27 };
     28 
     29 class OperationAdd:public Operation{
     30 public:
     31     int getResult(){
     32         return (getNumberA() + getNumberB());
     33     }
     34 };
     35 class OperationSub:public Operation{
     36 public:
     37     int getResult(){
     38         return (getNumberA() - getNumberB());
     39     }
     40 };
     41 class OperationMul:public Operation{
     42 public:
     43     int getResult(){
     44         return (getNumberA() * getNumberB());
     45     }
     46 };
     47 class OperationDiv:public Operation{
     48 public:
     49     int getResult(){
     50         return (getNumberA() / getNumberB());
     51     }
     52 };
     53 
     54 class IOperationFactory{
     55 public:
     56     virtual Operation * createOperation()=0;
     57 };
     58 class AddFactory:public IOperationFactory{
     59 
     60     Operation* createOperation(){
     61         return new OperationAdd();
     62     }
     63 };
     64 class SubFactory:public IOperationFactory{
     65     Operation* createOperation(){
     66         return new OperationSub();
     67     }
     68 };
     69 class MulFactory:public IOperationFactory{
     70     Operation* createOperation(){
     71         return new OperationMul();
     72     }
     73 };
     74 class DivFactory:public IOperationFactory{
     75     Operation* createOperation(){
     76         return new OperationDiv();
     77     }
     78 };
     79 //简单工厂模式
     80 class SimpleFactory{
     81 public:
     82     IOperationFactory *createOperationFactory(char ch){
     83         IOperationFactory *pf;
     84         switch (ch)
     85         {
     86         case '+': pf = new AddFactory();break;
     87         case '-': pf = new SubFactory();break;
     88         case '*': pf = new MulFactory();break;
     89         case '/': pf = new DivFactory();break;
     90         }
     91         return pf;
     92     }
     93     static SimpleFactory& createSimpleFactory(){
     94         static SimpleFactory sf;
     95         return sf;
     96     }
     97 };
     98 int _tmain(int argc, _TCHAR* argv[])
     99 {
    100     IOperationFactory *pf = SimpleFactory::createSimpleFactory().createOperationFactory('+');
    101     Operation *p = pf->createOperation();
    102     p->setNumberA(2);
    103     p->setNumberB(3);
    104     cout << p->getResult()<< endl;
    105     return 0;
    106 }

     抽象工厂模式

    抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

    适用场景:易于交换产品系列。让具体的创建实例过程与客服端分离,客户端通过他们的抽象接口操纵实例,产品的具体类名被具体工厂实现分离,不会出现在客户代码中。

      1 // OperationFactory.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include <iostream>
      6 #include <string>
      7 using namespace std;
      8 
      9 class IUser{
     10 
     11 public:
     12     virtual void inserUser()=0;
     13     virtual IUser* getUserByID(int id)=0;
     14 };
     15 class IDepartment{
     16 public:
     17     virtual void inserDepartment()=0;
     18     virtual IDepartment* getDepartmentByID(int id)=0;
     19 };
     20 class sqlUser:public IUser{
     21 public:
     22     void inserUser(){
     23         cout << "插入sqlUser"<< endl;
     24     }
     25     IUser *getUserByID(int id){
     26         cout << "得到id为"<<id<<"的sqluser"<<endl;
     27         return NULL;
     28     }
     29 };
     30 class oracleUser:public IUser{
     31 public:
     32     void inserUser(){
     33         cout << "插入oracleUser"<< endl;
     34     }
     35     IUser *getUserByID(int id){
     36         cout << "得到id为"<<id<<"的oracleUser"<<endl;
     37         return NULL;
     38     }
     39 };
     40 class sqlDepartment:public IDepartment{
     41 public:
     42     void inserDepartment(){
     43         cout << "插入sqlDepartment"<< endl;
     44     }
     45     IDepartment *getDepartmentByID(int id){
     46         cout << "得到id为"<<id<<"的sqlDepartment"<<endl;
     47         return NULL;
     48     }
     49 };
     50 class oracleDepartment:public IDepartment{
     51 public:
     52     void inserDepartment(){
     53         cout << "插入oracleDepartment"<< endl;
     54     }
     55     IDepartment *getDepartmentByID(int id){
     56         cout << "得到id为"<<id<<"的oracleDepartment"<<endl;
     57         return NULL;
     58     }
     59 };
     60 
     61 /*
     62 不使用简单工厂模式
     63 class IFactory{
     64 public :
     65     virtual IUser* createUser()=0;
     66     virtual IDepartment *createDepartment()=0;
     67 };
     68 class sqlFactory:public IFactory{
     69 public:
     70     IUser *createUser(){
     71         cout << "create sqlUser!"<<endl;
     72         return new sqlUser();
     73     }
     74     IDepartment *createDepartment(){
     75         cout << "create sqlDepartment!"<<endl;
     76         return new sqlDepartment();
     77     }
     78 };
     79 class oracleFactory:public IFactory{
     80 public:
     81     IUser *createUser(){
     82         cout << "create oracleUser!"<<endl;
     83         return new oracleUser();
     84     }
     85     IDepartment *createDepartment(){
     86         cout << "create oracleDepartment!"<<endl;
     87         return new oracleDepartment();
     88     }
     89 };*/
     90 //简单工厂模式
     91 class DataAccess{
     92 public:
     93 
     94     IUser * createUser(char ch){
     95         cout << "createUser" << endl;
     96         IUser *u;
     97         switch(ch){
     98         case 's': u = new sqlUser();break;
     99         case 'o': u = new oracleUser();break;
    100         }
    101         return u;
    102     }
    103 
    104     IDepartment * createDepartment(char ch){
    105         cout << "createDepartment" << endl;
    106         IDepartment *d;
    107         switch(ch){
    108         case 's': d = new sqlDepartment();break;
    109         case 'o': d = new oracleDepartment();break;
    110         }
    111         return d;
    112     }
    113     static DataAccess & createDataAccess(){
    114         static DataAccess data;
    115         return data;
    116     }
    117 };
    118 int _tmain(int argc, _TCHAR* argv[])
    119 {
    120     //IFactory *f = new sqlFactory();
    121     //IFactory *f = new oracleFactory();
    122     char ch = 's';
    123     IUser *u = DataAccess::createDataAccess().createUser(ch);
    124     IDepartment *d = DataAccess::createDataAccess().createDepartment(ch);
    125     u->inserUser();
    126     d->inserDepartment();
    127     return 0;
    128 }
  • 相关阅读:
    codeforces707B:Bakery
    codeforces707A:Brain's Photos
    BZOJ1084 [SCOI2005]最大子矩阵
    BZOJ1264 [AHOI2006]基因匹配Match
    BZOJ2764 [JLOI2011]基因补全
    codevs1257 打砖块
    BZOJ1079 [SCOI2008]着色方案
    BZOJ1026 [SCOI2009]windy数
    菜鸟学自动化测试(一)----selenium IDE
    关于w3school的html5部分output 元素实例代码(点亲自试一试进去)的问题纠正
  • 原文地址:https://www.cnblogs.com/zhangjxblog/p/8939967.html
Copyright © 2011-2022 走看看