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

    简单工厂模式

    简介

    简单工厂模式是最简单的设计模式之一,其实它并不严格属于23种设计模式,但是其应用也相当频繁,同时它也是其余创建型模式的基础。

    简单工厂模式:定义一个简单工厂类,它可能根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

    结构

    UML

    实现

    实现方式:

    • 设计一个抽象产品类,它包含一些公共方法的实现。
    • 从抽象产品类中派生出很多具体产品类,它实现具体产品生产的相关代码。
    • 设计一个工厂类,工厂类中提供一个生产各种产品的工厂方法,该方法根据传入参数创建不同的具体产品类对象。
    • 客户只需调用工厂类的工厂方法,并传入具体产品参数,即可得到一个具体产品对象。
    // 抽象产品类
    class AbstractProduct {
    public:
        // 抽象方法
    };
    
    // 具体产品类
    class ConcreteProduct: public AbstractProduct {
    public:
        // 具体实现方法
    };
    
    class Factory {
    public:
        AbstractProduct createProduct(std::string productName) {
            AbstractProduct pro = nullptr;
            if(productName == "ProductA") {
                pro = new ProductA();
            } else if(productName == "ProductB") {
                pro = new ProductB();
            }
        }
    };
    
    

    实例

    问题描述

    同学们想要进行户外运动,他们可以选择打篮球、踢足球或者玩排球。他们需要凭票去体育保管室拿,票上写着一个具体球类运动的名字,比如“篮球”。体育保管室负责人根据票上的字提供相应的体育用品。

    问题解答

    // Example.cpp
    
    #include <iostream>
    #include <memory>
    
    // 抽象产品类
    class AbstractSportProduct {
    public:
        virtual ~AbstractSportProduct(){}
        // 抽象方法
        virtual void printName() = 0;
        virtual void play() = 0;
    };
    
    
    // 具体产品类Basketball
    class Basketball: public AbstractSportProduct {
    public:
        Basketball(){
            printName();
            play();
        }
        // 具体实现
        void printName(){
            std::cout << "get Basketball." << std::endl;
        }
        void play(){
            std::cout << "play Basketball." << std::endl;
        }
    };
    
    
    // 具体产品类Football
    class Football: public AbstractSportProduct {
    public:
        Football(){
            printName();
            play();
        }
        // 具体实现
        void printName(){
            std::cout << "get Football." << std::endl;
        }
        void play(){
            std::cout << "play Football." << std::endl;
        }
    };
    
    
    // 具体产品类Volleyball
    class Volleyball: public AbstractSportProduct {
    public:
        Volleyball(){
            printName();
            play();
        }
        // 具体实现
        void printName(){
            std::cout << "get Volleyball." << std::endl;
        }
        void play(){
            std::cout << "play Volleyball." << std::endl;
        }
    };
    
    
    // 工厂类
    class Factory {
    public:
        AbstractSportProduct* getSportProduct(std::string productName) {
            AbstractSportProduct *pro = nullptr;
            if(productName == "Basketball") {
                pro = new Basketball();
            } else if(productName == "Football") {
                pro = new Football();
            } else if(productName == "Volleyball") {
                pro = new Volleyball();
            }
            return pro;
        }
    };
    
    
    int main(int argc, char *argv[]) {
        std::shared_ptr<Factory> fac = std::make_shared<Factory>();
        AbstractSportProduct *pro = nullptr;
    
        pro = fac->getSportProduct("Basketball");
        pro = fac->getSportProduct("Football");
        pro = fac->getSportProduct("Volleyball");
    
        return 0;
    }
    

    总结

    优点

    • 工厂类提供创建具体产品的方法,并包含一定判断逻辑,客户不必参与产品的创建过程。
    • 客户只需要知道对应的产品的参数即可。

    缺点

    • 明显违背了开闭原则(对拓展开放,对修改关闭),即在拓展功能时修改了既有的代码。
    • 简单工厂模式所有的判断逻辑都在工厂类中实现,一旦工厂类设计故障,则整个系统都会受到影响。

    场景

    与其他模式的关系

    • 简单工厂模式是其余创建型模式(工厂方法模式抽象工厂模式)的基础。
  • 相关阅读:
    什么是API
    Maxiee的Vim入门日记(4)——安装windows下的Cscope
    将字符串变成大写----C++实现
    POJ 3254 炮兵阵地(状态压缩DP)
    UIKit和Core Graphics绘图(三)——绘制虚线,椭圆以及饼图
    CRC 模式及实现
    [HDU 1317]XYZZY[SPFA变形][最长路]
    poj 2155 Matrix
    [置顶] Application,Session,Cookie之Application对象
    [Todo] Java及C++ Exception整理
  • 原文地址:https://www.cnblogs.com/parzulpan/p/13546452.html
Copyright © 2011-2022 走看看