GOF23设计模式之 工厂模式

工厂模式:

  • 实现了创建者与调用者的分离
  • 核心本质:
    • 实例化对象,用工厂方法代替new操作。
    • 将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的现实类解耦。
  • 详细分类:
    • 简单工厂模式
      • 用来生产同一个等级结构中的任意产品(对于增加新的产品,需要修改已有代码)
    • 工厂方法模式
      • 用来生产同一等级结构中的固定产品。(支持增加任意产品)
    • 抽象工厂方式
      • 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

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

  • OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭
  • DIP (依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程。
  • LoD(迪米特法则,Law of Demeter):只与你直接朋友通信,而避免和陌生人通信。

简单工厂模式(静态工厂模式)代码实现:

/**
 * Audi和Byd实现了接口Car
 * @author chang
 *
 */
public class CarFactory {
    public static Car creatCar(String type){
    if(type.equals("奥迪")){
        return new Audi();
    }else if(type.equals("比亚迪")){
        return new Byd();
    }else{
        return null;
    }
    }
}
/**
 * 对比有无工厂模式
 * @author chang
 *
 */
public class Client01 {

    public static void main(String[] args) {
//  Car c1 = new Audi();
//  Car c2 = new Byd();

    //通过工厂模式有效的减少了创建Car对象时所要了解的信息。解耦效果明显
    Car c1 = CarFactory.creatCar("奥迪");
    Car c2 = CarFactory.creatCar("比亚迪");

    c1.run();
    c2.run();
    }

}
  • 简单工厂模式的另一种实现方式
package com.coderbean.factory.simplefactory;
/**
 * Audi和Byd实现了接口Car
 * @author chang
 *
 */
public class CarFactory2 {
   public static Car createAudi(){
       return new Audi();
   }

   public static Car createByd(){
       return new Byd();
   }
}
  • 要点:
    • 简单工厂模式也叫静态工厂模式,就是工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
    • 对于增加新的产品无能为力!不修改代码的话,是无法扩展的。

工厂方法模式

  • 实现代码:
/**
 * 测试工厂方法模式
 * @author chang
 *
 */
public class Client {
    //这里CarFactory是一个接口,AudiFactory等都实现了这个接口。
    public static void main(String[] args) {
    Car c1 = new AudiFactory().creatCar();
    Car c2 = new BydFactory().creatCar();

    c1.run();
    c2.run();
    }

}
  • 工厂方法模式要点
    • 为了避免简单工厂模式的缺点,不完全满足OCP。
    • 工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。
  • 简单工厂模式和工厂方法模式的比较
    1. 结构复杂度(简单工厂优于工厂方法模式)
    2. 代码复杂度(简单工厂优于工厂方法)
    3. 客户端编程难度(简单工厂优于工厂方法)
    4. 管理上的难度(简单工厂优于工厂方法)
  • 根据设计理论:建议工厂方法模式。但实际上,我们一般都用简单工厂模式。

抽象工厂模式

  • 用来生产不同产品族的全部产品(对于新产品的增加,无能为力;支持增加产品族)
  • 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
  • 实现代码:略

工厂模式要点:

  • 简单工厂模式(静态工厂模式)
    • 虽然某种程度不符合设计原则,但实际使用最多
  • 工厂方法模式
    • 不修改已有类的前提下,通过增加新的工厂来实现扩展
  • 抽象工厂模式
    • 不可以增加产品,可以增加唉产品族!
  • 应用场景:
    • JDK中Calendar的getInstance方法
    • JDBC中Connection对象的获取
    • Hibernate中SessionFactory创建Session
    • Spring中IOC容器创建管理bean对象
    • XML解析时的DocumentBuilderFactory创建解析器对象
    • 反射中Class对象的newInstanceI()

你可能感兴趣的:(Java)