简述工厂模式(Factory Pattern)

      是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

 

工厂模式的核心:

  • 实现了调用者和使用者的分离

 

详细分类:本文只介绍简单工厂模式

  • 简单工厂模式: 用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改已有代码)       
  • 工厂方法模式:用来生产统一登记结构中的固定产品(支持增加任意产品)  
  • 抽象工厂模式:用来生产不同产品族的全部产品(对于增加新的产品,无能为力,支持增加产品族)

 

创建步骤

步骤1:创建一个接口

package com.ly.factory.simplefactory;

public interface Car {
    void run();
}

步骤2:创建接口的实体类

package com.ly.factory.simplefactory;

public class Audi implements Car{
    @Override
    public void run() {
        System.out.println("奥迪飞驰中");
    }
}
package com.ly.factory.simplefactory;

public class Byd implements Car {
    @Override
    public void run() {
        System.out.println("比亚迪飞驰中");
    }
}

 步骤3:创建一个工厂,生成基于给定信息的实体类的对象。

package com.ly.factory.simplefactory;

/**
 * simpleFactory模式
 * liyang 2020-07-09
 * 1、用来生产同一等级结构中的任意产品
 * 2、对于增加新的产品,需要修改已有代码
 * 3、也叫做静态工厂模式,因为工厂类一般使用静态方法
 * 4、对于增加新产品,必须类中增加代码,违反开闭原则
 *
 * 分工越细,对类的设计越来越复杂,但是对调用者来说很简单
 */

public class CarFactory {
    public static Car createCar(String type){
        if("audi".equals(type)){
            return new Audi();
        }else if("byd".equals(type)){
            return new Byd();
        }
        //增加新产品,在这里增加代码
        return null;
    }
}

步骤4:使用该工厂,通过传递类型信息来获取实体类的对象。

package com.ly.factory.simplefactory;

/**
 * 使用简单工厂模式进行测试
 * liyang 2020-07-09
 */
public class Client02 {
    public static void main(String[] args) {
        Car c1 = CarFactory.createCar("audi");
        Car c2 = CarFactory.createCar("byd");
        c1.run();
        c2.run();
    }
}

结果: 

奥迪飞驰中
比亚迪飞驰中

Process finished with exit code 0

进一步优化:

对于步骤3 如果新增大量产品,会出现大量的if-else语句,因此可按如下改造:

package com.ly.factory.simplefactory;

/**
 * simpleFactory模式优化
 * liyang 2020-08-14
 */

public class CarFactory {
    public static Car createAudi(){
        return new Audi();
    }

    public static Car createByd(){
        return new Audi();
    }

    //增加新产品,在这里增加函数即可
}

相应地改动步骤4的代码

package com.ly.factory.simplefactory;

/**
 * 使用简单工厂模式进行测试
 * liyang 2020-08-14
 */

public class Client02 {
    public static void main(String[] args) {
        Car c1 = CarFactory.createAudi();
        Car c2 = CarFactory.createByd();
        c1.run();
        c2.run();
    }
}

 结果同上


扩展:

        如果不使用简单工厂方法,在创建Car实例的时候就需要知道具体的实现类叫什么,使用工厂模式,我们统一丢到CarFactory中来生产具体的实例,具体生产方法不用关注。

package com.ly.factory.simplefactory;

/**
 * 测试在没有工厂模式的情况下
 * liyang 2020-07-09
 */

public class Client01 {
    public static void main(String[] args) {
        //创建Car对象时,Car的具体实现类需要知道
        Car c1 = new Audi();
        Car c2 = new Byd();
        c1.run();
        c2.run();
    }
}

结果同上