Loading

【设计模式】简单工厂模式

简单工厂模式

简介

简单工厂模式是最简单的设计模式之一,其实它并不严格属于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;
}

总结

优点

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

缺点

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

场景

与其他模式的关系

  • 简单工厂模式是其余创建型模式(工厂方法模式抽象工厂模式)的基础。
posted @ 2020-08-22 17:43  Parzulpan  阅读(134)  评论(0编辑  收藏  举报