实现了创建者和调用者的分离
核心本质
用来生产同一等级结构中的任意产品(对于增加新的产品,需要覆盖已有代码)
用来生产同一等级结构中的固定产品(支持增加任意产品)
围统一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
原来的设计
Car接口
public interface Car {
void name();
}
Tesla实现Car接口
public class Tesla implements Car{
@Override
public void name() {
System.out.println("特斯拉!");
}
}
WuLing实现Car接口
public class WuLing implements Car{
@Override
public void name() {
System.out.println("五菱宏光");
}
}
Consumer
public class Consumer {
public static void main(String[] args) {
Car car1 = new WuLing();
Car car2 = new Tesla();
car1.name();
car2.name();
}
}
面向对象的话,你买车不需要知道具体,只需要知道什么车,你new车相当于造车,我们只需要从工厂里买
新建一个工厂,我们只需要告诉工厂要什么车,就可以得到。不用管细节
public class CarFactory {
public static Car getCar(String car) {
if (car.equals("五菱")) {
return new WuLing();
} else if (car.equals("特斯拉")) {
return new Tesla();
}else {
return null;
}
}
消费者
//使用工厂
Car car = CarFactory.getCar("五菱");
car.name();
工厂的缺点
在加个车大众,还需要在CarFactory中修改,违反了开闭原则
这样写,虽然不用改原来的逻辑了,但还是要增加一些新代码
消费者不用去关心细节
每个车的工厂类实现工厂接口,然后消费者只需要调用对应工厂就可以得到车
当新加一个车的时候,只需要增加对应工厂类实现工厂接口
Car接口
public interface Car {
void name();
}
所有车都要实现Car接口
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉!");
}
}
public class WuLing implements Car {
@Override
public void name() {
System.out.println("五菱宏光");
}
}
CarFactory接口
public interface CarFactory {
Car getCar();
}
所有的工厂都必须实现工厂接口
public class TeslaFactory implements CarFactory{
@Override
public Car getCar() {
return new Tesla();
}
}
public class WuLingFactory implements CarFactory{
@Override
public Car getCar() {
return new WuLing();
}
}
新增的时候,加一个车类加一个工厂类,符合开闭原则
public class MoBai implements Car{
@Override
public void name() {
System.out.println("摩拜单车");
}
}
消费者
public class Consumer {
public static void main(String[] args) {
Car car = new WuLingFactory().getCar();
Car car1 = new MoBaiFactory().getCar();
car.name();
car1.name();
}
}
工厂方法模型
工厂类越来越多
结构复杂度:简单工厂模式低
代码复杂度:简单工厂模式低
编程复杂度:简单工厂模式低
管理复杂度:简单工厂模式低
根据设计原则:使用工厂方法模式
实际业务:简单工厂模式