本文共 873 字,大约阅读时间需要 2 分钟。
工厂方法模式
1. 定义
Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory method lets a class defer instantiation to subclasses (工厂方法定义了创建对象的接口,但是让子类决定初始化哪一个类,工厂方法使得一个类将其初始化推迟到子类)
2. 分析
良好的封装性:客户不需要了解创建对象的过程,只需要将自己想要的产品的特征告诉工厂类的对象即可获得想要的产品对象;符合迪米特原则;
优秀的扩展性:在增加产品种类的情况下,只需要适当修改或者派生出新的工厂类即可,已有客户端代码几乎不受影响。屏蔽了产品类使得接口不变则系统中的上层模块就不变;
常见的如使用JDBC连接数据库,可以方便的实现从MySQL转变为Oracle;
3. 实现方法
- 屏蔽产品类:使用抽象的Produce类;
- 工厂方法:根据传入的参数(一般为产品的特征,比如名字之类的)生成对应的Product子类;
4. 体现的
- 单一职责原则:使用Product的Client不应该负责Product的具体创建,所以应该将其交给对应的工厂方法;这样便各司其职,互不干扰;
- 里氏替换原则:隔离Product类自然要用到继承,抽象Product类和具体子类间自然需要满足里氏替换原则;
- 依赖倒置原则:创建对象的代码由于同具体Product打交道相当于底层模块;Client作为具体Product的使用者,相当于高层模块,他们之间不应该有直接的依赖关系;他们都应该依赖抽象:抽象的Product;
- 接口隔离原则,这里不涉及到;
- 迪米特原则:Client只需要知道Product的特征即可获得相应对象,而无需了解详细的创建过程;
- 开闭原则:通过隔离Product的构建过程,使得添加新的product时,对代码的影响控制于工厂方法中,从Client的角度来看,对 “扩展”的确是比较友好的;