框架的基础知识
- 框架是什么:框架就是能完成一定功能的半成品软件。
- 框架能干什么
- 完成一定功能,加快应用开发进度。
- 给我们一个精良的程序架构
- 对框架的理解
- 基于框架来开发,事情还是那些事情,只是看谁做的问题
- 基于框架来开发,可以不去做框架所做的事情,但是应噶明白框架在干什么,以及框架是如何实现相应功能的
- 框架和设计模式的关系
- 设计模式比框架更抽象
- 设计模式是比框架更小的体系结构元素
- 框架比设计模式更加特例化
工厂方法模式
定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。
结构:
-
Product:定义实际使用的对象的接口
-
ConcreteProduct:具体的Product接口的实现对象
-
Creator:工厂,声明工厂方法
-
ConcreteCreator:具体的工厂
//产品 public interface Product {} //具体产品 public class ProductImpl implements Product{} //工厂 public abstract class Factory { //创建Product的工厂方法 public abstract Product factoryProduct(); //钩子(hook)等其他方法 } public class FactoryImpl extends Factory{ //返回具体的产品 @Override public Product factoryProduct() { return new ProductImpl(); } }
理解工厂方法模式
-
本质: 延迟到子类来选择实现
-
实现成抽象类:
工厂方法的实现中,父类通常会是一个抽象类,里面包含创建所需对象的方法,这些抽象方法就是工厂方法。注意:子类在实现这些抽象方法时,通常并不是真正由子类来实现具体功能,而是在子类的方法里做选择,选择具体的产品实现对象。
- 实现成具体类:
也可以把父类实现成一个具体类。这种情况下,通常是在父类中提供获取所需对象的默认实现,这样即使没有具体的子类,也能够运行。
通常这种情况下还是需要具体的子类来决定具体要如何创建父类所需要的对象。这种情况称为工厂方法为子类提供了挂钩(钩子方法hook,详见模板方法模式)。通过工厂方法,可以让子类对象来覆盖父类的实现,从而提供更好的灵活性。
-
谁来使用工厂方法创建的对象?
工厂方法模式的本意,是由Factory对象内部的方法来使用工厂方法创建的对象,也就是说,工厂方法一般不提供给Factory外部使用。即:在工厂方法模式里,客户端要么使用Factory对象,要么使用Factory创建的对象,一般客户端不直接使用工厂方法。当然也可以直接把工厂方法暴露给客户端操作,但一般不这么做
/** *@Function: 客户端使用Factory对象的情况 */ public abstract class Factory { /** * 工厂方法,一般不对外 */ protected abstract Product factoryProduct(); /** * 提供给外部使用的方法 * 客户端一般使用这些方法来完成所需功能 */ public void someOperation(){ //在这里使用工厂方法 Product p=factoryProduct(); } }
工厂方法模式与IoC/DI
理解IoC/DI
- IoC:Inversion of Control DI:Dependency Injection
- 三方参与者:某个对象;IoC/DI容器;某个对象的外部资源
- 依赖注入与控制反转是同一概念吗?
依赖注入和控制反转是对同一件事情的不同描述。
- 依赖注入(是从应用程序的角度描述的):应用程序依赖容器创建并注入它所需要的外部资源
- 控制反转(是从容器的角度去描述的):容器控制应用程序,由容器反向的向应用程序注入其所需的外部资源
- 意义
IoC/DI思想让应用程序由主动变被动,被动的等待IoC/DI容器来创建并注入它所需要的资源。这样有效地分离了对象和所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
工厂方法与IoC/DI
思想相似,都是“主动变被动”,进行了“主从换位”,从而获得了更灵活的程序结构
工厂方法模式的思考
工厂方法模式是为克服简单工厂的缺点(主要是为满足开闭原则)而设计出来的,对设计原则的体现:依赖倒置原则
工厂方法模式优缺点
优点:
-
可以在不知具体实现的情况下编程
-
更容易扩展对象的新版本
-
挂钩使得扩展新的对象版本变的非常容易
-
-
连接平行的类层次
缺点:
-
具体产品对象和工厂方法的耦合性