其他分享
首页 > 其他分享> > 简单工厂模式

简单工厂模式

作者:互联网

1 定义

2 具体组成

工厂模式主要有三部分组成:1 抽象父类 2 各种具体的子类 3 工厂类,其具体的类图如下图所示:

 

类名 父类 说明
抽象父类 该类是其他类的父类,主要是用来进行各种子类的继承
子类 i 抽象父类 继承自抽象父类,实现各自具体、特定的功能
工厂类 用来生产出来各种子类
其他类 用来调用其他的类,和其他的类是依赖关系
#ifndef HEADER_H__
#define HEADER_H__

#include <string>                                                                                                                                              
#include <iostream>


/*
	说明:抽象父类Car,被ChanganCar和MingjueCar继承,然后再factory中被生产
*/

// 抽象父类
class Car{
public:
    virtual void makeCar() = 0;; 
protected:
    Car(std::string name, int price):_name(name), _price(price)
    {   
    
    }   
    std::string _name;
    int _price;
};

class ChanganCar:public Car 
{
public:
    ChanganCar(std::string name, int price):Car(name, price)
    {   
        std::cout << "make a ChanganCar" << std::endl;
    }   

    void makeCar()override
    {   
        std::cout << "make a ChanganCar, " << "price = " << _price << " ,name = " << _name << std::endl;
    }   
};

class MingjueCar:public Car
{
public:
    MingjueCar(std::string name, int price):Car(name, price)
    {
        std::cout << "make a ChanganCar" << std::endl;
    }
        
    void makeCar()override
    {
        std::cout << "make a MingjueCar, " << "price = " << _price << " ,name = " << _name << std::endl;
    }
};


class SimpleFactory
{
public:
    static Car*  make_product(const std::string name)                 // 记得这个要设置为static的,以为有一个工厂就够了
    {
        if(name == "Changan")
            return new ChanganCar("changan", 100000);
        else if(name == "Mingjue")
            return new MingjueCar("mingjue", 150000);
        return nullptr;
    }
};

#endif              

3 总结优缺点

优点:

​ 将创建实例和使用实例分开,使用者不必关心对象是是如何创建的,实现解耦合。相当于只是对外提供了接口,更加的安全,符合面向对象编程的思想。

​ 用户根本不需要了解内部的实现,只需要进行简单的传参,就可以得到想要的结果

缺点:

​ 该工厂包含着所有的实例,一旦这个工厂不能正常的工作,系统就会收到影响。

​ 违反 ”开放--关闭原则“,即添加产品的时候,需要对工程的代码重新进行修改,这是不合理的。

吐槽:这SB的博客园是真的难用啊

标签:子类,name,Car,price,模式,工厂,简单,父类
来源: https://www.cnblogs.com/moxianbaolianxisheng/p/16607254.html