zoukankan      html  css  js  c++  java
  • C++设计模式——简单工厂模式

    问题描述

    之前在公司做了一个windows 8平台的阅读器。首先,需要将电子书中的内容渲染到屏幕上,而电子书每一页都包含各种各样的内容,比如:图形、图像和文字等等;不同的内容,就是不同的对象;在将不同的内容渲染到屏幕上之前,就需要new操作,建立不同的对象,然后再在屏幕上进行描绘。这个时候,就需要进行很多new操作,new操作分布在代码的不同地方,管理起来很麻烦,而且也很乱,到后期扩展和维护的时候,有的时候,对象多的让开发人员不知道这个对象是干什么的,这就增加了难度;同时,new操作,都会有对应的异常处理,最后,就会发现,在代码中,new了一个对象,然后,就跟着一段异常处理代码,这时编码变的极其混乱和臃肿。那么怎么办?怎么办?此时,我们需要一个新的类,专门从事对象的建立和释放,之后,对象的各种操作,和这个类没有任何关系。这个专门建立对象的类,向外暴漏创建对象的接口,供外部调用。

    工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。

     

    UML类图

    对于工厂模式,具体上可以分为三类:

    1. 简单工厂模式;
    2. 工厂方法模式;
    3. 抽象工厂模式。

    对于上面的三种工厂模式,从上到下逐步抽象,并且更具一般性。而这篇博文主要讲的是简单工厂模式,后两种会在之后的博文中接着总结。

    ProductA、ProductB和ProductC继承自Product虚拟类,Show方法是不同产品的自描述;Factory依赖于ProductA、ProductB和ProductC,Factory根据不同的条件创建不同的Product对象。

     

    适用场合

    1. 在程序中,需要创建的对象很多,导致对象的new操作多且杂时,需要使用简单工厂模式;
    2. 由于对象的创建过程是我们不需要去关心的,而我们注重的是对象的实际操作,所以,我们需要分离对象的创建和操作两部分,如此,方便后期的程序扩展和维护。

    代码实现

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 
     5 typedef enum ProductTypeTag
     6 {
     7     TypeA,
     8     TypeB,
     9     TypeC
    10 }PRODUCTTYPE;
    11 
    12 // Here is the product class
    13 class Product
    14 {
    15 public:
    16     virtual void Show() = 0;
    17 };
    18 
    19 class ProductA : public Product
    20 {
    21 public:
    22     void Show()
    23     {
    24         cout<<"I'm ProductA"<<endl;
    25     }
    26 };
    27 
    28 class ProductB : public Product
    29 {
    30 public:
    31     void Show()
    32     {
    33         cout<<"I'm ProductB"<<endl;
    34     }
    35 };
    36 
    37 class ProductC : public Product
    38 {
    39 public:
    40     void Show()
    41     {
    42         cout<<"I'm ProductC"<<endl;
    43     }
    44 };
    45 
    46 // Here is the Factory class
    47 class Factory
    48 {
    49 public:
    50     Product* CreateProduct(PRODUCTTYPE type)
    51     {
    52         switch (type)
    53         {
    54         case TypeA:
    55             return new ProductA();
    56 
    57         case TypeB:
    58             return new ProductB();
    59 
    60         case TypeC:
    61             return new ProductC();
    62 
    63         default:
    64             return NULL;
    65         }
    66     }
    67 };
    68 
    69 int main(int argc, char *argv[])
    70 {
    71     // First, create a factory object
    72     Factory *ProductFactory = new Factory();
    73     Product *productObjA = ProductFactory->CreateProduct(TypeA);
    74     if (productObjA != NULL)
    75         productObjA->Show();
    76 
    77     Product *productObjB = ProductFactory->CreateProduct(TypeB);
    78     if (productObjB != NULL)
    79         productObjB->Show();
    80 
    81     Product *productObjC = ProductFactory->CreateProduct(TypeC);
    82     if (productObjC != NULL)
    83         productObjC->Show();
    84 
    85     delete ProductFactory;
    86     ProductFactory = NULL;
    87 
    88     delete productObjA;
    89     productObjA = NULL;
    90 
    91     delete productObjB;
    92     productObjB = NULL;        
    93 
    94     delete productObjC;
    95     productObjC = NULL;
    96 
    97     return 0;
    98 }

     

     

  • 相关阅读:
    D. Constructing the Array
    B. Navigation System
    B. Dreamoon Likes Sequences
    A. Linova and Kingdom
    G. Special Permutation
    B. Xenia and Colorful Gems
    Firetrucks Are Red
    java getInstance()的使用
    java 静态代理和动态代理
    java 类加载机制和反射机制
  • 原文地址:https://www.cnblogs.com/ring1992/p/9592569.html
Copyright © 2011-2022 走看看