美文网首页
工厂模式

工厂模式

作者: 第八区 | 来源:发表于2017-09-11 17:27 被阅读16次

工厂模式分三类:

  • 简单工厂
  • 工厂方法
  • 抽象工厂

简单工厂不属于设计模式,因为其违背了设计模式的开闭原则,后面会有介绍。

工厂方法

factory_function.png

相关元素:

  • 抽象工厂
  • 具体工厂
  • 抽象产品
  • 具体产品

示例

抽象产品

class Car {
public:
    virtual void printInfo()=0;
};

具体产品

class BenChi :public Car {
public:
    void printInfo() {
        cout << "BenChi" << endl;
    }
};

class Aodi :public Car {
public:
    void printInfo() {
        cout << "Aodi" << endl;
    }
};

抽象工厂

class AbstractFactory {
public:
    virtual Car * createCar() = 0;
};

具体工厂:

class FactoryBenchi :public AbstractFactory {
public:
    Car * createCar() {
        return new BenChi();
    };
};

class FactoryAodi :public AbstractFactory {
public:
    Car * createCar() {
        return new Aodi();
    };
};

这是一个比较标准的工厂方法设计模式。车可以生产车,那具体的奥迪车工厂可以生产奥迪车,奔驰车工厂可以生产奔驰的车。当需要生产法拉利的车时,我们只需要实现一个法拉利的产品,然后实现一个法拉利的工厂即可,而不需要修改之前的代码。这符合开闭原则。

简单工厂

factory_simple.png

这是工厂模式的简单实现方式,包含元素

  • 工厂类
  • 抽象产品
  • 抽象方法

示例

这里抽象产品和抽象方法和前面一样。
工厂类

class SimpleFactory{
public:
    static Car * createCar(const string type) {
        if (type == string("benchi")) {
            return new BenChi();
        }
        else if (type == string("aodi")) {
            return new Aodi();
        }
        else {
            return NULL;
        }
    }
};

我们看到工厂类就是一个单独的类,通过传入的参数来区分返回什么样的产品。比如:当需要生产法拉利时,我们需要修改工厂类的方法。这不符合开闭原则,所以它不属于设计模式。只是工厂模式的一个变相简单的实现。

抽象工厂

前面说到工厂方法只能生产一个类型的产品。当我们需要生产一系列的产品,比如:我们需要奥迪的发动机,那么肯定也是在奥迪的工厂生产,那么这里就可以使用抽象工厂设计模式

元素

  • 抽象工厂
  • 具体工厂
  • 抽象产品(多个)
  • 具体产品

示例

这里我们再Car的基础上在增加一个产品Engine

class Engine {
public:
    virtual void printName() = 0;
};

实现类:

class EngineBenchi :public Engine {
public:
    void printName() {
        cout << "benchi engine" << endl;
    }
};

class EngineAodi :public Engine {
public:
    void printName() {
        cout << "aodi engine" << endl;
    }
};

抽象类也需要进行修改:

class AbstractFactory {
public:
    virtual Car * createCar() = 0;
    virtual Engine * createEngine() = 0;
};

实现类:

class FactoryBenchi :public AbstractFactory {
public:
    Car * createCar() {
        return new BenChi();
    };
    Engine * createEngine() {
        return new EngineBenchi();
    }
};

class FactoryAodi :public AbstractFactory {
public:
    Car * createCar() {
        return new Aodi();
    };
    Engine * createEngine() {
        return new EngineAodi();
    }
};

测试代码:

int main()
{
    AbstractFactory *factory = NULL;
    Car* car = NULL;
    Engine* engine = NULL;
    factory=new FactoryBenchi();
    car = factory->createCar();
    car->printInfo();
    engine = factory->createEngine();
    engine->printName();
    delete factory;
    delete car;
    delete engine;
    factory = new FactoryAodi();
    car = factory->createCar();
    car->printInfo();
    engine = factory->createEngine();
    engine->printName();
    delete factory;
    delete car;
    delete engine;
    return 0;
}

这样我们就完成的奥迪工厂既可以生产车,也可以生产发动机。同样我们也发现了他的缺点。当需要再添加一种商品时,发现需要修改很多地方。抽象工厂需要修改,同时所有的实现类都需要发生修改。产品的扩展很复杂。优点当然也明显,它是的产品族的多个产品设计在一起工作时,它能保证使用的是同一个产品族的产品。

相关文章

  • 常用设计模式

    设计模式 工厂模式 工厂模式思路上分:简单工厂模式,工厂模式, 抽象工厂模式// 抽象工厂模式可以代替工厂模式,做...

  • 工厂模式

    工厂模式细分三种:简单工厂模式、工厂模式、抽象工厂模式。 工厂模式相当于抽象了简单工厂模式的工厂类,而抽象工厂模式...

  • 工厂模式

    工厂模式 就是工厂---生产-->产品 在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式. 工厂模式...

  • 找女朋友之简单工厂模式,工厂模式,抽象工厂模式

    找女朋友之简单工厂模式,工厂模式,抽象工厂模式 找女朋友之简单工厂模式,工厂模式,抽象工厂模式

  • 【设计模式】- 工厂模式

    工厂模式分为三种:简单工厂模式、工厂方法模式和抽象工厂模式。 工厂模式:靠工厂生产对象 简单工厂模式中只有一个工厂...

  • 工厂模式

    工厂模式包含三种模式:简单工厂模式、工厂方法模式和抽象工厂模式。 简单工厂模式 定义简单工厂模式:由一个工厂类根据...

  • Java设计模式——工厂模式

    工厂模式简单工厂模式工厂方法模式抽象工厂模式 1.简单工厂模式 1.基本介绍1)简单工厂模式也叫静态工厂模式,是属...

  • 设计模式-3种工厂模式

    工厂模式包括:简单工厂模式,工厂方法模式,抽象工厂模式 简单工厂模式 工厂方法根据参数直接创建实例:工厂->产品 ...

  • 设计模式-工厂模式

    工厂模式概念 实例化对象,用工厂方法代替new操作。工厂模式包括工厂方法模式和抽象工厂模式。抽象工厂模式是工厂模式...

  • 第一章2.0工厂- 基础类准备

    2.1工厂-简单工厂模式2.2工厂-工厂方法模式2.3工厂-抽象工厂模式

网友评论

      本文标题:工厂模式

      本文链接:https://www.haomeiwen.com/subject/epefsxtx.html