设计模式之简单工厂模式
简单工厂模式并未被收录到GOF的二十三种设计模式中,但这也是我们编程时常用到的一种形式。
结构
- 抽象产品——定义产品的规范,描述产品的主要特性和功能。
- 具体产品——实现或继承抽象产品的子类。
- 具体工厂——提供创建产品的方法,调用者通过该方法来获取产品对象。
实现
我们实现一个典型的咖啡案例:
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("本店没有此咖啡")
}
}