设计模式之简单工厂模式

135 阅读2分钟

设计模式之简单工厂模式

简单工厂模式并未被收录到GOF的二十三种设计模式中,但这也是我们编程时常用到的一种形式。

结构

  • 抽象产品——定义产品的规范,描述产品的主要特性和功能。
  • 具体产品——实现或继承抽象产品的子类。
  • 具体工厂——提供创建产品的方法,调用者通过该方法来获取产品对象。

实现

我们实现一个典型的咖啡案例:

FactoryCoffee.png

Coffee类作为底层父类,AmericanCoffee和LatteCoffee继承Coffee

SimpleCoffeeFactory用于创建Coffee类的实例并返回

工厂如何判断该创建哪一类的咖啡呢?

添加一个判断:

//SimpleCoffeeFactory.class
public  Coffee createCoffee(String type) {
    //用于接收不同类型创建的coffee对象
    Coffee coffee = null;
    if("american".equals(type)) {
        coffee = new AmericanCoffee();
    }else if("latte".equals(type)) {
        coffee = new LatteCoffee();
    } else {
        throw new RuntimeException("本店没有此咖啡")
    }
}

然后我们就可以在CoffeeStore中点咖啡了,成功实现了解耦

//CoffeeStore.class
public Coffee orderCoffee(String type) {
    SimpleCoffeeFactory factory = new SimpleCoffeeFactory();
    //调用生产咖啡的方法
    Coffee coffee = factory.createCoffee(type);
    return coffee;
}

优缺点

优点:

封装了创建对象的过程,可以通过参数直接获取对象。把对象的创建和业务逻辑层分开,这样以后就避免了修改客户代码(CoffeeStore),如果要实现新产品,可以直接在工厂类(CoffeeFactory)中修改,不需要在源代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。

缺点:

增加新产品时仍需要修改工厂类(CoffeeFactory)的代码。违背了“开闭原则”。

扩展

在开发中我们也可以将工厂类中创建对象的方法定义为静态方法,这样不用创建工厂类实例就可以调用方法,更加方便!

//SimpleCoffeeFactory.class
public static Coffee createCoffee(String type) {
    //用于接收不同类型创建的coffee对象
    Coffee coffee = null;
    if("american".equals(type)) {
        coffee = new AmericanCoffee();
    }else if("latte".equals(type)) {
        coffee = new LatteCoffee();
    } else {
        throw new RuntimeException("本店没有此咖啡")
    }
}