工厂模式
- 实现了创建者和调用者的分离 。
- 详细分类又分为三类
- 1), 简单工厂模式 -->用来生产同一等级结构中的任意产品。(对于增加新产品 ,需要修改已有的代码)
- 2),工厂方法模式 -->用来生产同一等级结构中固定产品 。 (支持增加任意产品)
- 3),抽象工厂模式 -->用来生产不同产品品类的全部产品 。(对于增加新的产品,无能无力 , 支持增加产品族)
核心本质 :
- 实例化对象 ,用工厂方法代替 new 操作 。
- 将选择实现类 , 创建对象统一管理和控制 。 从而将调用者跟我们的实现类解耦 。
所有面向对象的设计原则包括设计模式
- OCP (开闭原则 , Open -Closed Principle ) : 一个软件的实体应当对扩展开放 , 对修改关闭 。
- DIP (依赖倒转原则 , Dependence Inversion Principle ) :要针对接口编程 , 不要针对实现编程 。
- LOD (迪米特法则 , Law of Demeter ) :只与你直接的朋友通信 , 而避免和陌生人通信 。
接下来实现简单工厂模式
1), 首先创建我们的Car类接口
/**
*汽车类接口
*/
public interface Car {
void run();
}
2),创建实现类 奥迪类与比亚迪类
/**奥迪类
* @author 晓电脑
*/
public class AudiCar implements Car {
@Override
public void run() {
System.out.println("奥迪车再跑");
}
}
/**比亚迪类
* @author 晓电脑
*/
public class BydCar implements Car {
@Override
public void run() {
System.out.println("比亚迪再跑");
}
}
3), 如果没有使用简单工厂模式 ,我们是这样创建奥迪类与比亚迪类的
/**
* 没有工厂模式下创建车
* 相当于调用者 调用者需要知道Car 还要知道AudiCar类
*/
public class NoFactoryTest {
public static void main(String[] args) {
Car car1 = new AudiCar();
Car car2 = new BydCar();
car1.run();
car2.run();
}
}
这样调用者不仅需要知道Car 这个接口 ,还要知道Car下面有几个实现 ,这就相当于一个司机,他不需要知道车是怎么创建的,他只要会开车就行了,接下来我们构建UML图来看一下
接下来我们用简单工厂模式来看一下
创建一个工厂类
/**
* 简单的工厂
* 创建者
* 如果现在增加新的类 如奔驰类 我们修改工厂类 违反了开闭原则 所以说简单工厂模式是有一些小问题
*
*/
public class FactoryCar {
public static Car createCar(String type) {
Car car = null;
switch (type) {
case "奥迪":
car = new AudiCar();
break;
case "比亚迪":
car=new BydCar();
break;
default:
}
return car;
}
}
使用工厂模式我们就可以直接在工厂里面获取如下
/**
* 工厂模式下创建车
* 相当于调用者
*/
public class FactoryTest01 {
public static void main(String[] args) {
Car car1 = FactoryCar.createCar("奥迪");
Car car2 = FactoryCar.createCar("比亚迪");
car1.run();
car2.run();
}
}
在工厂模式下,我们只要告诉工厂我们需要什么车,然后工厂就给我们返回那个车,我们不需要知道奥迪车与比亚迪车是如何创建的我们来看下UML类图
总结:
- 简单工厂模式又叫静态工厂模式 , 就是工厂类 一般使用静态方法 , 通过接受参数的不同来返回不同的实例对象。
- 对于增加新产品无能为力 ! 不修改代码的话, 无法进行扩展 。