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

    简单工厂模式

    概述:

    简单工厂模式属于创建型模式,创建型模式主要关注点是“怎样创建对象?”,它的主要特点是“将创建对象与使用分离”。这样可以降低系统的耦合度,使用者不需要关心对象创建的细节,对象的创建由相关的工厂去完成。

    简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或者接口)的实例。

    该模式中包含了一下三个角色:

    工厂角色(Factory):创建所有实例的内部逻辑。

    shapeFactory.cpp

    class shapeFacetory {
    public:
    shape* shapeFacetory::getShape(std::string shapeType)
    {
        if (shapeType == "circle") {
            return new circle();
        }    
        else if (shapeType == "rectangle") {
            return new rectangle();
    
        }
        else if (shapeType == "square") {
            return new square();
        }
    }
    }:

    抽象产品角色(Abstract Product):简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

    shape抽象类

    class shape {
    public:
        virtual void draw() = 0;
    };

    具体产品角色(Concrete Product):是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

    circle.cpp、rectangle.cpp、square.cpp

    class circle : public shape {
    public:
        std::cout << "Inside Circle::draw() method.";
    };
    class rectangle : public shape {
    public:
        std::cout << "Inside Rectangle::draw() method.";
    };
    class square : public shape {
    public:
        std::cout << "Inside Square::draw() method.";
    };

    main函数实现

    #include "shape.h"
    #include "circle.h"
    #include "square.h"
    #include "rectangle.h"
    #include "shapeFactory.h"
    int main() {
        shapeFacetory* factory = new shapeFacetory;
        shape* ps = factory->getShape("circle");
        ps->draw();
        return 0;
    }

    优点

    工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。

    缺点

    由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
    当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
    这些缺点在工厂方法模式中得到了一定的克服。

    使用场景

    工厂类负责创建的对象比较少;
    客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
    由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

    源码地址:https://github.com/zhousong666/TestProject/tree/master/DesignModel/SimpleFactory

  • 相关阅读:
    json对象和字符串的相互转换
    使用link rel="shortcut icon"为网页标题加图标
    jQuery——Js与jQuery的相互转换
    用accessKey设置快捷键
    CSS :invalid 选择器
    创建并调用 DLL(1)
    调用外部 DLL 中的函数(2. 晚绑定)
    调用外部 DLL 中的函数(1. 早绑定)
    VCL 中的 Windows API 函数(6): BeginDeferWindowPos
    VCL 中的 Windows API 函数(5): AlphaBlend
  • 原文地址:https://www.cnblogs.com/zhousong918/p/11152344.html
Copyright © 2011-2022 走看看