1. 简单工厂模式(静态工厂)
1.1 原理简单解析
我们先看一下原理图,我们就已汽车的工厂为例子,看不懂没关系,我们结合代码来进行理解
1.2 代码实现
先定义一个简单的Car接口
public interface Car {
//汽车品牌的方法
void brand();
}
定义两个汽车实现类
public class DaZhong implements Car{
@Override
public void brand() {
System.out.println("大众汽车");
}
}
public class WuLing implements Car {
@Override
public void brand() {
System.out.println("五菱神车");
}
}
让我们建造一个汽车工厂
public class CarFactory {
public Car getCar(String brand){
if("五菱神车".equals(brand)){
return new WuLing();
}
if("大众汽车".equals(brand)){
return new DaZhong();
}else
return null;
}
}
好了,代码准备都有了,我们进行原理解析吧~
public class Customer {
public static void main(String[] args) {
//不适用工厂方式的时候,我们这样直接new对象
Car car = new DaZhong();
Car car1 = new WuLing();
car.brand();//结果打印 大众汽车
car1.brand();//结果打印 五菱神车
//我们借助简单工厂模式,那么便可以这样做
Car car2 = CarFactory.getCar("大众汽车");
Car car3 = CarFactory.getCar("五菱神车");
//区别于new的方式,工厂帮我们解决了创建对象的问题
//我们只需要传递参数,而不需要关注创建过程
}
}
简单工厂模式局限 :假如我们增加一个新的车,那么必须对CarFactory的代码进行修改,不满足开闭原则,下面的工厂方法模式,将对这种不足进行解决。
2. 工厂方法模式
2.1 简单原理图
同样我们还是先将原理图放在这,结合代码理解原理
2.2 代码实现
我们需用需用1.2节中,Car接口,Wuling实现类和DaZhong实现类
我们需要新添加汽车工厂接口,DaZhong和Wuling工厂的实现类
public interface CarFactory {
Car getCar();
}
public class WuLingFactory implements CarFactory {
@Override
public Car getCar() {
return new WuLing();
}
}
public class DaZhongFactory implements CarFactory {
@Override
public Car getCar() {
return new DaZhong();
}
}
下面我们进行解析
public class Customer {
public static void main(String[] args) {
//我们想要得到想要的车,我们就去找对应的汽车工厂实现类
//而简单工厂模式,是去找统一的Factory去获得汽车
//得到大众汽车
Car car = new DaZhongFactory().getCar();
//得到五菱神车
Car car1 = new WuLingFactory().getCar();
}
}
总结 :工厂方法模式能够在增加新的汽车的时候不去改变核心的代码,只需添加对应的汽车的工厂。虽然这样满足了开闭原则,但是这让代码量大大增加,维护成本变高,在日常开发中,简单工厂模式仍然是用的比较多。