设计模式 - 工厂模式

前言

        假设你开了一家奶茶店,顾客可以点普通奶茶,珍珠奶茶,香芋奶茶和红枣奶茶

一.传统模式

        传统模式下,顾客根据名字点单,你获取名字然后做出奶茶。

class MilkTea{
    string name;
public:
    MilkTea* create(string TeaName){
        MilkTea * newTea=new MilkTea();
        newTea.name=TeaName;
        return newTea;
    }
}
        

设计模式 - 工厂模式_第1张图片

         在这种情况下,我们想要做其他口味的奶茶,就需要对原有代码进行修改;在简单情况下还好,但是类的关系稍加复杂,我们就得修改所有相关代码。比如我们想做柠檬水,还想做西瓜椰,这将导致我们需要在原来的类中添加相关属性,并且不是所有奶茶都需要的,奶茶的种类多时,整个类 就过于耦合。为了降低耦合性,我们想到了简单的工厂模式。

二.简单工厂模式

        为了使我们增加其他种类奶茶的时候不需要对父类进行修改,我们增加了奶茶工厂类。

class MilkTea{
    string name;
public:
    MilkTea(string _name):name(_name){}
    virtual create()=0;
}

class 红枣奶茶:public MilkTea{
public:
    红枣奶茶(string _name){
        MilkTea(_name);
    }
    void create(){
        制作了一杯红枣奶茶!
    }
}

......

class 柠檬水:public MilkTea{
public:
    柠檬水(string _name){
        MilkTea(_name);
    }
    void create(){
        制作了一杯柠檬水!
    }
    
} 

class MilkFactory{
public:
    MilkFactory *create(string TeaName){
        catch(TeaName){
        case 红枣奶茶:
                    return new 红枣奶茶(TeaName);
        case ...
        break;
        }
    }
}

         (看起来好像比传统模式的代码多了,但在实际情况下,传统模式代码并不少,并且耦合性非常高,不利于实际开发中的增删改查)在这里我们不添加所有属性,可以看到我们想增加一种奶茶时,并不需要修改原来的MilkTea类,只需要添加相应的奶茶类,然后在工厂中添加部分代码即可。但是此时又出现问题,就是我们每次增加一种奶茶,都需要增加一个具体类和实现工厂,当奶茶成倍增加时,在一定程度上增加了系统复杂度,也增加了系统具体类的依赖。

三.工厂方法模式

四.抽象工厂模式

你可能感兴趣的:(设计模式,设计模式)