工厂方法模式:延迟到子类来选择实现

简介: 工厂方法模式的本质是延迟到子类来选择实现;其体现了依赖倒置原则。

框架与设计模式

    框架是什么:框架是能完成一定功能的半成品软件。
    框架做什么:框架能够完成一定功能,加速应用开发速度;可提供一个精良的程序架构。
    框架与应用程序的关系:谁来做和做什么?框架完成一部分功能,应用开发人员完成一部分功能。
    比如在一个大的应用系统中,应用开发只需要关注业务实现即可,应用框架可能实现的功能有:
    (1)统一响应返回报文,规范报文格式内容;
    (2)基类定义,通用字段约定;
    (3)统一异常处理机制;
    (4)提供公共API使用,工具类开发;
    (5)提供第三方组件封装使用,如:hadoop、hbase、kafka、mybitas、redis等;
    应用程序:只需关注业务流程功能实现。接口开发、用户体验交互等。

框架与设计模式的比较:

    (1)设计模式比框架更抽象:框架是一个已经实现了的半成品软件;设计模式在于解决的问题的方案和思想上。
    (2)设计模式是 比框架更小的体系结构元素:框架是已实现了的软件,而一个框架可包含多种设计模式的应用。
    (3)框架比设计模式更特例化:框架是针对特定领域的,解决的是某个领域内的问题,每个领域的框架都是不一样的;设计模式注重从思想上、方法上解决问题,不局限于某个领域,更加通用化。

定义及本质
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
本质:延迟到子类来选择实现。
结构示意图:
image.png
工厂方法详解
(1)工厂方法的功能,是让主类在不知道具体实现的情况下,完成自身功能的调用;而将具体的实现延迟到子类实现。
(2)工厂方法的实现,通常父类是一个抽象类,抽象类中包含创建对象的抽象方法,这些抽象方法就是工厂方法。
(3)工厂方法的返回,一般是被创建对象的接口对象,一个抽象类或一个类的实例。
(4)工厂方法一般不提供给外部(客户端)调用,其所创建的对象一般也不提供给外部使用,主要由创建器类内部的方法来使用工厂方法创建对象。
(5)可以把父类由抽象类实现成为一个具体的类。

依赖倒置原则

   依赖:要依赖抽象类,不要依赖于具体类。
   倒置:也就是接口的所有权问题,低层实现的接口所有权不在低层组件手中,而是倒置到高层组件了。接口中的功能就是高层组件需要的功能,高层组件提出要求,由低层组件实现高层组件所要求的接口功能。

image.png

UML类图
image.png

调用时序图
image.png

优缺点
优点:
(1)无须知道具体实现:具体实现由子类完成。
(2)容易扩展新的对象:通过工厂方法给子类的挂钩(钩子方法hook),子类提供工厂方法的实现,即可使用该子类。
(3)连接平行的类层次:使层次更易扩展和复用。
缺点:
具体产品对象和工厂方法耦合:工厂方法创建对象时,需要选择具体实现的对象,这个对象和工厂方法耦合性。

应用场景及代码实现

// 1 客户端调用类
public class Client {
     public static void main(String[] args) {
           AbstractCreator creatorA = new AConcreteCreator();
           creatorA.operation();
           AbstractCreator creatorB = new BConcreteCreator();
           creatorB.operation();
     }
}
// 2 创建器:声明工厂方法
public abstract class AbstractCreator {
     // 2.1 声明工厂方法,由子类实现,实例化业务接口对象
     protected abstract Api factoryApi();
     // 2.2 具体业务功能实现方法
     public void operation(){
           // 2.3 AbstractCreator需要Api对象,不再主动创建业务实现类,交给子类的factoryApi()去实现(IOC/DI)
           Api api = factoryApi();
           api.operation();
     }
}
// 3.1 具体创建器对象类A,继承创建器类
public class AConcreteCreator extends AbstractCreator{
     @Override
     protected Api factoryApi() {
           // 3.1.1 真正的选择业务实现类,并创建对象(IOC/DI)
           return new AApiImpl();
     }
}
// 3.2 具体创建器对象类B,继承创建器类
public class BConcreteCreator extends AbstractCreator{
     @Override
     protected Api factoryApi() {
           return new BApiImpl();
     }
}
// 4 业务接口类
public interface Api {
     public void operation();
}
// 5.1 业务接口实现类A
public class AApiImpl implements Api {
     @Override
     public void operation() {
           System.out.println("AApiImpl do...");
     }
}
// 5.2 业务接口实现类B
public class BApiImpl implements Api {
     @Override
     public void operation() {
           System.out.println("BApiImpl do...");
     }
}
相关文章
|
设计模式 算法 Java
JAVA设计模式13:模版方法模式,将一些步骤延迟到子类中实现
JAVA设计模式13:模版方法模式,将一些步骤延迟到子类中实现
类特性(抽象类)
类特性(抽象类)
87 1
|
11天前
|
存储 JavaScript 前端开发
构造函数继承有什么缺点?
【10月更文挑战第26天】构造函数继承虽然能够实现属性的继承,但在方法继承、内存使用效率、访问父类原型属性以及实现多态性等方面存在一些缺点。在实际开发中,可以根据具体的需求和场景,结合其他继承方式来综合解决这些问题,以实现更高效、更灵活的继承机制。
24 8
|
3月前
|
设计模式 存储 缓存
单例模式与工厂方法模式之间的差异
【8月更文挑战第24天】
48 0
|
设计模式 Java 数据库
JAVA设计模式2:工厂方法模式,将对象的实例化过程封装在子类
JAVA设计模式2:工厂方法模式,将对象的实例化过程封装在子类
|
6月前
|
设计模式 Java 数据库连接
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别
设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。那么三者有什么区别呢?
163 1
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别
|
6月前
创建型 简单工厂(工厂方法)模式
创建型 简单工厂(工厂方法)模式
58 1
|
设计模式 算法
抽象类应用模板方法模式和接口应用之策略设计模式
抽象类应用模板方法模式和接口应用之策略设计模式
60 0
|
设计模式
【大话设计模式】方法重写和方法重载的区别
【大话设计模式】方法重写和方法重载的区别
|
设计模式 程序员 编译器
【大话设计模式】封装 继承 多态
【大话设计模式】封装 继承 多态