关于抽象工厂模式的一些见解


代码:

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

(0)
上一篇 2022年7月26日 03:29
下一篇 2022年7月26日 03:29

相关推荐

发表回复

登录后才能评论