工厂模式
- 实现创建者和调用者的分离(调用者更加方便,不用详细知道如何创建的过程)
- 分类
- 简单工厂模式(静态工厂模式)
- 用来生产同一等级结构中的任意产品(对于新的产品,需要修改代码)
- 工厂方法模式
- 用来生产同一等级的固定产品(支持增加任意产品)
- 抽象工厂模式
- 用来生产不同品族的全部产品(对于增加新的产品,无能为力;支持增加新的产族)
- 简单工厂模式(静态工厂模式)
核心本质
- 实例化对象,用工厂方法代替new
- 将选择实现类,创建对象统一管理,从而将调用者和实现类解耦
面向对象设计的基本原则
- OCP(开闭原则):一个软件的实体应当对扩展开放,对修改关闭
- DIP(依赖倒转原则):针对接口(抽象)编程,不针对实现编程
- LoD(迪米特法则):只与直接的朋友通信,避免与陌生人通信,减少依赖
假设现在有两个汽车类实现了汽车接口
public interface Car{
void run();
}
public class Audi implements Car{
public void run(){
System.out.println("奥迪汽车run")
}
}
public class Byd implements Car{
public void run(){
System.out.println("比亚迪汽车run")
}
}
没有工厂模式时候
Car c1 = new Audi();
Car c2 = new Byd();
此时没有工厂模式 调用者需要知道Car 以及Car的实现汽车类,还需要如何创建对象(new),如果实习类的创建很复杂,参数很多,调用者调用过程就很复杂。
简单工厂模式
public Class SimpleCarFactory{
/static修饰 方便调用
public static Car createCar(String type){
if("audi".equals(type)){
return new Audi();
}else if("byd".equals(type)){
return new Byd();
}else{
return null;
}
}
}
或者这样写
public Class SimpleCarFactory{
/static修饰 方便调用
public static Car createAudiCar(){
return new Audi();
}
public static Car createBydCar(){
return new Byd();
}
}
调用者调用,调用者不需要了解创建过程 ,只需要调用工厂来获取Car.
Car c1=CarSimpleCarFactory.createCar("audi");
但是简答工厂没有满足开闭原则。
工厂方法模式
一个工厂CarFactory接口
public interface CarFactory{
Car createCar();
}
创建一个Audi工厂,然后分别实现CarFactory接口
public class AudiCarFactory implements CarFactory {
public Car createCar(){
return new Audi();
}
}
创建一个Byd工厂,然后分别实现CarFactory接口
public class BydCarFactory implements CarFactory {
public Car createCar(){
return new Byd();
}
}
如果现在新增了一个产品Ben ,不用修改以上代码,新增一个Ben工厂实现CarFactory即可。
- 但是工厂方法模式结构复杂度更高了
- 代码复杂度增加
- 客户端编程难度增加
- 管理难度增加
根据设计理论,工厂方法模式更符合。考虑上面几点,实际开发中,一般采用简单工厂模式
抽象工厂模式 (针对产品族)
- 发动机Engine
public interface Engine {
void run();
}
public class HighEngine implements Engine {
public void run(){
System.out.println("高端发动机")
}
}
public class LowEngine implements Engine {
public void run(){
System.out.println("低端发动机")
}
}
- 座椅Seat
public interface Seat{
void seat();
}
public class HighSeat implements Seat{
public void seat(){
System.out.println("高端座椅")
}
public void Mess(){
System.out.println("高端座椅按摩")
}
}
public class LowSeat implements Seat{
public void seat(){
System.out.println("低端座椅")
}
}
- 有CarFactory接口(汽车工厂接口)有两个实现类HighCarFactory(高端),LowCarFactory(低端)
public interface CarFactory{
Engine CreateEngine();//发动机
Seat CreateSeat();//座位
}
/*高端汽车工厂
publica Class HighCarFactory implements CarFactory(){
public Engine CreateEngine(){
return new HighEngine ();//高端
}
pulic Seat CreateSeat(){
return new HighSeat();//高端
}
}
/*低端汽车工厂
publica Class HighCarFactory implements CarFactory(){
public Engine CreateEngine(){
return new LowEngine ();//低端
}
pulic Seat CreateSeat(){
return new LowSeat();//低端
}
}
- 此时可以增加一个产品族(中端汽车工厂)
/*中端
publica Class HighCarFactory implements CarFactory(){
public Engine CreateEngine(){
return new HighEngine ();//高端
}
pulic Seat CreateSeat(){
return new LowSeat();//低端
}
}
工厂模式应用场景举例
- JDK中Calendar的getInstance方法
- JDBC中Connection的获取
- Hibernate中的SessionFactory创建Session
- spring中IOC容器创建管理bean对象
- XML解析时的DocunmentBuilderFactory创建解析器对象
- 反射中Class对象的newInstance()