zoukankan      html  css  js  c++  java
  • Java设计模式之工厂模式(Factory Pattern)

    前言

    这篇文章主要讲述工厂模式,为什么使用工厂模式,工厂模式的种类及创建方式,工厂模式的应用场景等知识点的讲解,让我们一起来学习吧,lets go

    一、为什么使用工厂模式

    通过工厂模式可以实现创建者和调用者的分离,实现代码之间解耦,依赖。一句大白话就是就是减少类与类之间的依赖关系。

    面向对象设计的基本原则:

    OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭(类似,比如项目中有两个类,现在要实现一个新的功能,而不是去修改原来的两个来,而是需要新创建类是实现功能)。

    DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程, 不要针对实现编程(类似,例如项目中有个A类并且A类实现了一个接口,如果B类想和A类发生关系,应该通过他实现的接口,而不是他本身)。

    LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,而避免和 陌生人通信(类与类之间应少发生关系)。

    二、工厂模式的种类及创建方式

    第一种方式:简单工厂模式

    我们定义一个Car 接口,有两个实现子类分别是 DbCar ,AuCar ,通过CarFactory管理调用子类。

    实现的类图

    image-20200513213628404

    具体的代码实现

    /**
     * @author 13394
     */
    public interface Car {
    
        void run();
    }
    
    /**
     * @author 13394
     */
    public class DbCar implements Car {
        @Override
        public void run() {
            System.out.println("大奔跑");
        }
    }
    
    /**
     * @author 13394
     */
    public class AudCar implements Car {
        @Override
        public void run() {
            System.out.println("奥迪跑");
        }
    }
    
    /**
     * @author 13394
     */
    public class CarFactory {
        public static Car getAudCar() {
            return new AudCar();
        }
    
        public static Car getByCar() {
            return new DbCar();
        }
    }
    

    简单工厂模式工厂类一般是使用静态方法,通过接受不同的参数返回不同的实例对象,但是不满足OCP原则,增加新的产品需要修改原类中的代码。

    第二种:工厂模式

    主要是用来生产同一等级结构中的固定产品,下面我们定义一个Car 接口,有两个实现子类分别是 DbCar ,AuCar

    再定义一个工厂接口类 CarFactory ,两个实现类 AudCarFactory ,DbCarFactory 管理具体的对象。

    类图实现:

    image-20200513214238809

    工厂类具体实现代码:

    /**
     * @author 13394
     */
    public interface CarFactory {
         Car getInstance();
    }
    
    
    /**
     * @author 13394
     */
    public class AudCarFactory implements CarFactory {
        @Override
        public Car getInstance() {
            return new AudCar();
        }
    }
    
    /**
     * @author 13394
     */
    public class DbCarFactory implements CarFactory {
        @Override
        public Car getInstance() {
            return new DbCar();
        }
    }
    
    

    说明为了避免简单工厂模式的缺点,不完全满足OCP,工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个工厂类,而工厂方法模式有一组实现了相同接口的工厂类。

    第三种 :抽象工厂模式

    用来生产不同产品族的全部产品,是抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务 分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

    我们有三种产品分别是 发动机,座椅,引擎 ,并且这三种产品 分为两类,一类是高端的,一类是低端的,

    通过低端工厂(LowCarFactory),高端工厂(LuxuryCarFactroy),来管理,从而实现调用。

    类图实现:

    image-20200513215103580

    因涉及到的代码有点多,这里不一一展示了,具体参考码云代码见:

    抽象工厂模式

    三、 工厂模式的应用场景

    JDK中Calendar的getInstance方法

    JDBC中Connection对象的获取

    Hibernate中SessionFactory创建Session

    Spring中IOC容器创建管理bean对象

    XML解析时的DocumentBuilderFactory创建解析器对象

    反射中Class对象的newInstance()

    四、小结

    工厂模式要点:

    简单工厂模式(静态工厂模式) • 虽然某种程度不符合设计原则,但实际使用最多。

    工厂方法模式 • 不修改已有类的前提下,通过增加新的工厂类实现扩展。

    抽象工厂模式 • 不可以增加产品,可以增加产品族!

  • 相关阅读:
    教你一个vue小技巧,一般人我不说的
    分享一个好用的函数吧,将js中的对象转成url参数
    Vue源码探究-源码文件组织
    后端分布式系列:分布式存储-HDFS DataNode 设计实现解析
    Android Animation动画详解(二): 组合动画特效
    后端分布式系列:分布式存储-HDFS NameNode 设计实现解析
    Android开源框架ViewPageIndicator和ViewPager实现Tab导航
    解决某些手机RadioGroup中的RadioButton不居中(右移)问题
    Android Animation动画详解(一): 补间动画
    后端分布式系列:分布式存储-HDFS 架构解析
  • 原文地址:https://www.cnblogs.com/xiaofuzi123456/p/12885480.html
Copyright © 2011-2022 走看看