简述工厂模式(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();
}
}
结果同上