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

    模拟场景

    要求使用简单工厂模式设计一个可以创建不同几何形状(如矩形、圆形、三角形)的绘图工具,每个几何图形都具有绘制Draw()和擦除Erase()两个方法;

    UML类图

    分析需求:

    首先这个绘图工具要求可以提供一系列的几何图形绘制,包括矩形、圆形、椭圆形、三角形,这些图形对象要求都具备绘制Draw()和Erase()方法;因此,我们可以定义一个抽象基类CGraph,具有Draw()和Erase()的纯虚方法;因为不同的图形类型,它们的Draw()和Erase()具体实现和需要的参数是不同的,这里以实现三角形和正方形为例进行说明。

    CTriangle类描述三角形类信息,CSquare类描述正方形类信息,CGraphFactory类负责创建不同的几何对象,它由GreateGraph函数根据不同的参数,选择性的实例化几何对象。通过CGraphFactory类工厂用户可以不关心具体对象是如何创建的,只需要告诉类工厂,需要创建什么类型的几何图形即可,UML类图如下。

    下面给出简单工厂的定义:

    简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类;因为创建实例的类方式是静态方法,又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。

    这里写图片描述

    具体代码

    主体代码

    #include "stdafx.h"
    using namespace std;
    typedef enum
    {
        EN_DRAW_SQUARE = 0,
        EN_DRAW_TRIANGLE,
    }ENUM_DRAW_TYPE;
    
    #define  SAFE_DELETE_PTR(p) if ((p) != NULL)
    {            
        delete p;
        p = NULL;
    }
    //图形基类
    class CGraph
    {
    public:
        CGraph(){}
        virtual ~CGraph(){}
    public:
        virtual void Draw() = 0;
        virtual void Erase() = 0;
    };
    //正方形
    class CSquare:public CGraph
    {
    public:
        CSquare():m_width(10){ cout << "完成正方形对象创建" << endl;}
        ~CSquare(){}
    public:
        virtual void Draw()
        {
            cout << "绘制正方形" << endl;
        }
        virtual void Erase()
        {
            cout << "清除绘正方形" << endl;
        }
    private:
        int m_width;//正方形的独有参数
    };
    
    //三角形
    class CTriangle:public CGraph
    {
    public:
        CTriangle():m_bottom(10),m_high(12){cout << "完成三角形对象创建" << endl;}
        ~CTriangle(){}
    public:
        virtual void Draw()
        {
            cout << "绘制三角形" <<endl;
        }
        virtual void Erase()
        {
            cout << "清除三角形" << endl;
        }
    
    private:
        int m_bottom; //底
        int m_high;   //高
    };
    
    //图形创建工厂
    class CGraphFactory
    {
    public:
        //根据参数创建不同的对象
        static CGraph * CreateGraph(ENUM_DRAW_TYPE type)
        {
            CGraph * pGraph = NULL;
            switch(type)
            {
            case EN_DRAW_SQUARE:
                {
                    pGraph = new CSquare();
                    break;
                }
            case EN_DRAW_TRIANGLE:
                {
                    pGraph = new CTriangle();
                    break;
                }
            default:
                break;
            }
            return pGraph;
        }
    };
    

    客户端代码

     //简单工厂方法
     CGraph *pGraph = NULL;
     cout <<"请求创建三角形:"<< endl;
     pGraph  = CGraphFactory::CreateGraph(EN_DRAW_TRIANGLE);
    
     if (pGraph != NULL)
     {
         pGraph->Draw();
         pGraph->Erase();
         SAFE_DELETE_PTR(pGraph);
     }
    
     cout << endl <<"请求创建正方形:"<< endl;
     pGraph = CGraphFactory::CreateGraph(EN_DRAW_SQUARE);
     if (pGraph != NULL)
     {
         pGraph->Draw();
         pGraph->Erase();
         SAFE_DELETE_PTR(pGraph);
     }

    运行结果

    这里写图片描述

    简单工厂模式总结

    优点:

    通过工厂类用户不需要关心类对象的具体创建过程,使得对象的创建和使用分离,屏蔽了对象创建和初始化过程,方面用户使用;

    不足:

    主要的不足从以下方面展开:
    1. 工厂类负责一系列对象的创建,工厂类职责不单一;若处理不当,影响面比较大。
    2. 如果每个类创建过程中需要涉及复杂的初始化和相关准备,会造成工厂类逻辑复杂,不利于扩展和维护。
    3. 若需要新增其他对象创建,需要修改静态函数的分支判断,违背了“开放扩展,关闭修改”的原则。

    适用场合:

    1. 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
    2. 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。

    参考资料:
    http://blog.csdn.net/LoveLion/article/details/9300731

  • 相关阅读:
    JDBC第一部分
    java mysql学习第三部分
    java mysql 第六部分
    java mysql学习第五部分
    java mysql学习第二部分
    java mysql学习第一部分
    元注解
    改良之前写的模拟栈代码
    java中如何自定义异常
    java中的语法规则
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468220.html
Copyright © 2011-2022 走看看