JAVA之 工厂设计模式

工厂模式

  • 实现创建者和调用者的分离(调用者更加方便,不用详细知道如何创建的过程)
  • 分类
    • 简单工厂模式(静态工厂模式)
      • 用来生产同一等级结构中的任意产品(对于新的产品,需要修改代码)
    • 工厂方法模式
      • 用来生产同一等级的固定产品(支持增加任意产品)
    • 抽象工厂模式
      • 用来生产不同品族的全部产品(对于增加新的产品,无能为力;支持增加新的产族)
核心本质
  • 实例化对象,用工厂方法代替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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值