代码:
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不算做之前的代码),这样做符合开闭原则
原创文章,作者:1402239773,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/277003.html
