代码:
CoffeStore(咖啡店类)
public class CoffeStore { private CoffeFactory coffeFactory; public void setCoffeFactory(CoffeFactory coffeFactory) { this.coffeFactory = coffeFactory; } Coffe orderCoffe(){ return coffeFactory.createCoffe(); } }
CoffeFactory(咖啡工厂抽象类)
public abstract class CoffeFactory { abstract Coffe createCoffe(); }
Coffe(咖啡抽象类)
public abstract class Coffe { }
AmericanCoffe(美式咖啡类)
public class AmericanCoffe extends Coffe{ }
AmericanCoffeFacotry(美式咖啡工厂类)
public class AmericanCoffeFactory extends CoffeFactory{ @Override Coffe createCoffe() { return new AmericanCoffe(); } }
客户端
public class Client { public static void main(String[] args) { CoffeStore coffeStore = new CoffeStore(); coffeStore.setCoffeFactory(new AmericanCoffeFactory()); System.out.println(coffeStore.orderCoffe()); } }
首先:看到这个代码一定很疑惑,既然用户端直接new了一个咖啡工厂类,为什么不直接调用咖啡工厂的create方法生成一个coffe对象,但是可以试想一下,咖啡店假如还要对咖啡工厂生成的咖啡再进行一次加工(加冰/加糖)
再者,我们不应该把客户端和咖啡店想成一体的,可以大胆把除Client类的其他java类想象成一个java框架,框架的作用是提供coffe对象,不会有人用mybatis的时候自己用动态代理来生成一个mapper。感觉说的有点迷糊
总的来说:
给咖啡店一个setCoffeFactory方法,减少了咖啡店和咖啡工厂的耦合,咖啡店只需要取调用咖啡工厂的create方法生成咖啡,只需要关心咖啡进一步加工这一业务,而不需要关心咖啡工厂是什么,而咖啡工厂只需要关心咖啡对象的生成。如果需要新增一个类型的咖啡,只需要再添加一个咖啡类和咖啡工厂类,但之前的代码却完全不需要改变(client不算做之前的代码),这样做符合开闭原则