工厂模式
核心本质(实现了创建者和调用者的分离)
- 实例化对象不用new,用工厂方法代替
- 将选择实现类,创建对象统一管理和控制,从而将调用者和我们的实现类解耦
分类
- 简单工厂模式(对于增加新的产品,需要修改代码)
- 工厂方法模式(支持增加任意产品)
- 抽象工厂模式(单独作为一种设计模式)
遵循的OOP原则
- 开闭原则:一个软件的实体对扩展开放,对修改关闭
- 依赖倒转原则:要针对接口编程,不要针对实现编程
- 迪米特法则:只与你直接的朋友通信,避免和陌生人通信
1、简单工厂模式(没有实现开闭原则)
缺点:如果消费者想买一辆奥迪,我们只能在车工厂添加多一个判断条件,需要扩展原有代码
//定义一个汽车接口
public interface Car {
void name();
}
public class WuLin implements Car {
@Override
public void name() {
System.out.println("我是五菱宏光!");
}
}
public class LSLS implements Car {
@Override
public void name() {
System.out.println("我是劳斯莱斯!");
}
}
//定义一个创建车的工厂
public class CarFactory {
public static Car getCar(String car){
if (car.equals("WuLin")){
return new WuLin();
}
else if (car.equals("LSLS")){
return new LSLS();
}
else {
return null;
}
}
}
//模拟消费者买车
public class Consumer {
public static void main(String[] args) {
Car car1 = CarFactory.getCar("WuLin");
Car car2 = CarFactory.getCar("LSLS");
car1.name();
car2.name();
}
}
2、工厂方法模式
缺点: 结构,代码,编程,管理相对于简单工厂模式都复杂的多
//定义一个汽车接口
public interface Car {
void name();
}
public class WuLin implements Car {
@Override
public void name() {
System.out.println("我是五菱宏光!");
}
}
public class LSLS implements Car {
@Override
public void name() {
System.out.println("我是劳斯莱斯!");
}
}
//定义一个制造汽车的接口
public interface CartFactory {
Car getCart();
}
//再创建对应汽车的实现类
public class WuLinFactory implements CartFactory {
@Override
public Car getCart() {
return new WuLin();
}
}
public class LSLSFactory implements CartFactory {
@Override
public Car getCart() {
return new LSLS();
}
}
//通过对应的汽车工厂得到车
public class Consumer {
public static void main(String[] args) {
Car car1 = new WuLinFactory().getCart();
Car car2 = new LSLSFactory().getCart();
car1.name();
car2.name();
}
}
3、结论
-
简单工厂模式(静态工厂模式)
虽然不算符合设计原则,但是实际使用多。
-
工厂方法模式
不修改已有类的前提下,通过增加新的工厂类实现扩展。