工厂设计模式
工厂设计模式分为:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
他们都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,目的是降低系统中代码耦合度,并且增强了系统的扩展性。
一、简单工厂模式
简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。
package com.assin;
/**
* @Author:ASSIN
* @Date: 2021/8/31 20:30
*/
public class CarFactory {
public Car createCar(String type){
if("BMW".equals(type)){
BMW car = new BMW();
return car;
}else if("BYD".equals(type)){
BYD car = new BYD();
return car;
}
return null;
}
}
package com.assin;
/**
* @Author:ASSIN
* @Date: 2021/8/31 20:10
*/
public abstract class Car {
private String color;
public void run (){
}
}
package com.assin;
/**
* @Author:ASSIN
* @Date: 2021/8/31 20:30
*/
public class BMW extends Car{
@Override
public void run() {
System.out.println("BMW启动");
}
}
package com.assin;
/**
* @Author:ASSIN
* @Date: 2021/8/31 20:32
*/
public class BYD extends Car{
@Override
public void run() {
System.out.println("BYD启动");
}
}
package com.assin;
/**
* @Author:ASSIN
* @Date: 2021/8/31 20:33
*/
public class client {
public static void main(String[] args) {
CarFactory carFactory = new CarFactory();
Car car = carFactory.createCar("BYD");
car.run();
}
}
二、工厂方法模式
我们说过java开发中要遵循开闭原则,如果将来有一天我想增加一个新的车,那么必须修改CarFactory,就不太灵活。解决方案是使用工厂方法模式。
抽象一个工厂接口
package com.assin;
/**
* @Author:ASSIN
* @Date: 2021/8/31 20:30
*/
public interface CarFactory {
public Car createCar();
}
针对某一产品构建一个工厂方法
package com.assin;
/**
* @Author:ASSIN
* @Date: 2021/8/31 22:36
*/
public class BYDFactory implements CarFactory{
@Override
public Car createCar() {
BYD byd = new BYD();
return byd;
}
}
package com.assin;
/**
* @Author:ASSIN
* @Date: 2021/8/31 22:35
*/
public class BMWFactory implements CarFactory{
@Override
public Car createCar() {
BMW bmw = new BMW();
return bmw;
}
}
package com.assin;
/**
* @Author:ASSIN
* @Date: 2021/8/31 20:33
*/
public class client {
public static void main(String[] args) {
CarFactory carFactory = new BMWFactory();
Car car = carFactory.createCar();
car.run();
}
}
好处
此模式中,通过定义一个抽象的核心工厂类,并定义创建产品对象的接口,创建具体产品实例的工作延迟到其工厂子类去完成。这样做的好处是核心类只关注工厂类的接口定义,而具体的产品实例交给具体的工厂子类去创建。当系统需要新增一个产品是,无需修改现有系统代码,只需要添加一个具体产品类和其对应的工厂子类,使系统的扩展性变得很好,符合面向对象编程的开闭原则。
缺点
工厂方法模式虽然扩展性好,但是增加了编码难度,大量增加了类的数量,所以怎么选择还是看实际的需求