Head First 设计模式--Factory

chapter 4 --工厂模式

                                  烘烤OO的精华

 

1. 当使用new时,是在实例化一个具体类,所以是对实现而不是接口进行编程。

 

2. 如果代码是针对接口而写,那么可以通过多态,它可以与任何新类实现该接口。

 

3. 在设计模式中,所谓的“实现一个接口”并不一定表示“写一个类,并利用implement关键词来实现某个Java接口”。“实现一个接口”泛指“实现某个超类型(可以是类或接口)的某个方法”。

 

4. 工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样,客户程序中关于超类的代码和子类对象创建代码解耦了。

abstract Product factoryMethod(String type)

- 工厂方法是抽象的,所以依赖子类来处理对象的创建

 

- 工厂方法必须返回一个产品。超类中定义的方法,通常使用到工厂方法的返回值。

- 工厂方法将客户(也就是超类中的代码)和实际创建具体产品的代码分隔开来。

- 工厂方法可能需要参数(也可能不需要)来指定所要的产品。

 

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

 

 

工厂方法模式:

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

 

Factory method

Structure

  • Product: 所有的产品必须实现这个共同的接口,这样,使用这些产品的类就可以引用这个接口,而不是具体类。
  • Creator: 是一个类,它实现了所有操纵产品的方法,但不实现工厂方法。Creator所有的子类都必须实现这个抽象的factoryMethod()方法。
  • ConcreteCreator: 实现了factoryMethod(),以实际制造出产品。
  • ConcreteProduct: 只有ConcreteCreator类知道如何创建这些产品。

设计原则:

 

(1)  要依赖抽象,不要依赖具体类。(依赖倒置原则)

说明了不能让高层组件依赖低层组件,而且,不管高层或低层组件,两者都应该依赖于抽象。所谓高层组件,是由其他低层组件定义其行为的类。倒置是指和一般OO设计的思考方式完全相反。低层组件现在依赖高层的抽象了。

 

 

以下指导方针,可以帮助你避免在OO设计中违反依赖倒置原则:

 

  • 变量不可以持有具体类的引用。如果使用new,就会持有具体类的引用。你可以改用工厂来避开这种做法。
  • 不要让类派生自具体类。如果派生自具体类,你就会依赖具体类。请派生自一个抽象(接口或抽象类)
  • 不要覆盖基类中已实现的方法。如果覆盖基类已实现的方法,那么你的基类就不是一个真正适合被集成的抽象。基类中已实现的方法,应该由所有的子类共享

 

6. 通过抽象工厂所提供的接口,可以创建产品的家族,利用这个接口书写代码,我们的代码将从实际工厂解耦,以便在不同的上下文中实现各式各样的工厂,制造出各种不同的产品。

 

7. 从抽象工厂中派生出一些具体工厂,这些工厂产生相同的产品,但产品的实现不同。

 

 

抽象工厂模式:

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

- 抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品是什么样子。

 

Abstract Factory

Structure

  • AbstractFactory: 抽象工厂定义了一个接口,所有的具体工厂都必须实现此接口,这个接口包含一组方法用来生产产品。
  • ConcreteFactory: 具体工厂实现不同的产品家族。要创建一个产品,客户只要使用其中的一个工厂而完全不需实例化任何产品对象。
  • Client: 客户的代码只需涉及抽象工厂,运行时将自动使用实际的工厂。
  • AbstractProduct: 这就是产品家族,每个具体工厂都能够生产一整组的产品。
  • Product

 

8. 抽象工厂的任务是定义一个负责创建一组产品的接口。这个接口内的每个方法都负责创建一个具体产品,同时我们利用实现抽象工厂的子类来提供这些具体的做法。所以,在抽象工厂中常利用工厂方法来实现生产方法。

 

9. 比较

工厂方法使用继承来负责创建对象,利用工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法。其实整个工厂方法模式,只不过就是通过子类来创建对象。所以工厂方法只负责将客户从具体类型中解耦;而抽象工厂使用组合来负责创建对象。抽象工厂提供一个用来创建一个产品家族的抽象类型,这个类型的子类定义了产品被产生的方法。要想使用这个工厂,必须先实例化它,然后将它传入一些针对对象类型所写的代码中。(组合)

 

 

本章小结:

  • 所有的工厂都是用来封装对象的创建。
  • 简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦。
  • 工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。
  • 抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中。
  • 所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合。
  • 工厂方法允许类将实例化延迟到子类进行。
  • 抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。
  • 依赖倒置原则,指导我们避免依赖具体类型,而要尽量依赖抽象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值