【HeadFirst设计模式】工厂模式

简单工厂

简单工厂不是一个设计模式,反而比较像是一种编程习惯。

Pizza简单工厂类图


PizzaStore是工厂的“客户”,PizzaStore通过SimplePizzaFactory取得pizza实例。

SimplePizzaFactory类中的createPizza()方法通常为静态方法。

Pizza通常定义为抽象类,具有一些有用的实现,这些实现可以被覆盖。


工厂方法模式(Factory Method Pattern)

所有工厂模式都用来封装对象的创建。工厂方法模式(Factory Method Pattern)通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。

创建者(Creator)类


PizzaStore为抽象创建者类,它定义了一个抽象的工厂方法,让子类实现此方法制造产品。

子类可以利用实现createPizza()创建自己风味的Pizza。


产品类


工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法把类的实例化推迟到子类。

类图


所有的产品都必须实现一个共同的接口(Product),这样一来,使用这些产品的类就可以引用这个接口,而不是具体类。

Creator是一个类,它实现了所有操纵产品的方法,但不实现工厂方法。而将工厂方法交给子类去实现。


设计原则(依赖倒置原则【Dependency Inversion Principle】):要依赖抽象,不要依赖具体类。

不能让高层组件依赖低层组件,而且,不管高层或低层组件,“两者”都应该依赖抽象。

所谓“高层”组件,是由其他低层组件定义其行为的类。例如,PizzaStore是“高层组件”,因为它的行为是由Pizza定义的:PizzaStore创建所有不同的比萨对象,准备、烘烤、切片、装盒;而Pizza本身属于“低层组件”,具体的Pizza和PizzaStore都实现了Pizza接口。

下面的方针,能避免在OO设计中违反依赖倒置原则:

变量不可以持有具体类的引用;(使用new就回持有具体类的引用)

不要让类派生自具体类;(如果派生自具体类,就会依赖具体类)

不要覆盖基类中已实现的方法;

应该尽量达到这些原则,而不是随时都要遵循这个原则,我们都很清楚,任何Java程序都有违反这些指导方针的地方。


抽象工厂模式提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。


AbstractFactory定义了一个接口,所有的具体工厂都必须实现此接口,这个接口包含了一组方法用来生产产品。

ConcreteFactory实现了产品家族。要创建一个产品,客户只要使用其中的一个工厂而完全不需要实例化任何产品对象。每个具体工厂都能够生产一整组的产品。

Client的代码中只需涉及抽象工厂,运行时将自动使用实际的工厂。

抽象工厂的每个方法实际上看起来都像是工厂方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章