工厂模式是一种创建型模式,它将创建对象逻辑封装起来,不会暴露给使用者,使用者只需要调用方法便可以获得完整的对象,符合迪米特法则
工厂模式适用在生成复杂对象的时候,而生成简单对象时,比如new一个对象,则不需要使用工厂模式
工厂模式可以减少代码耦合,生成一个对象,需要增加许多依赖关系的时候,就可以使用工厂模式
spring通过BeanFactory和ApplicationContext创建Bean对象时就使用了工厂模式
简单工厂模式由两个部分组成
工厂类可以有一个生成产品的方法,通过传参来判断生产哪个产品
用一个造车工厂做为例子
public interface Car {
void make();
}
汽车接口有一个make()方法
public class BmwCar implements Car{
public BmwCar(){
}
@Override
public void make() {
System.out.println("制造一辆宝马");
}
}
实现汽车接口,实现make()方法
public class PorscheCar implements Car {
public PorscheCar(){
}
@Override
public void make() {
System.out.println("制造一辆保时捷");
}
}
实现汽车接口,实现make()方法
public class CarFactory {
public Car makeCar(String type){
if("bmwCar".equals(type)){
return new BmwCar();
}
if("porscheCar".equals(type)){
return new PorscheCar();
}
return null;
}
}
通过传进来的type参数来判断生成哪个对象
public class Run {
public static void main(String[] args) {
//工厂
CarFactory carFactory = new CarFactory();
//从工厂获取宝马对象
Car bmwCar = carFactory.makeCar("bmwCar");
bmwCar.make();
//从工厂获取保时捷对象
Car porscheCar = carFactory.makeCar("porscheCar");
porscheCar.make();
}
}
工厂方法模式是在简单工厂模式上增加了抽象工厂类,抽象工厂有一个生成产品的方法,当新增一个产品时就创建一个工厂实现抽象工厂,简单来说,工厂方法模式就是一个工厂对应一个产品,通过工厂接口进行解耦
修改刚刚的工厂类
public interface AbstractFactory {
Car make();
}
public class BmwCarFactory implements AbstractFactory{
@Override
public Car makeCar() {
return new BmwCar();
}
}
public class PorcheCarFactory implements AbstractFactory {
@Override
public Car makeCar() {
return new PorscheCar();
}
}
public class Run2 {
public static void main(String[] args) {
//工厂
AbstractFactory bmwCarFactory = new BmwCarFactory();
AbstractFactory porscheFactory = new PorcheCarFactory();
//从工厂获取宝马对象
Car bmw = bmwCarFactory.makeCar();
bmw.make();
//从工厂获取保时捷对象
Car porsche = porscheFactory.makeCar();
porsche.make();
}
}
抽象工厂模式,是在工厂方法模式上扩展,在一个工厂中支持制造多个产品
在刚刚的基础上新增一个产品,这里我们假设宝马和法拉利产商也制造飞机
public interface Plane {
void make();
}
public class BmwPlane implements Plane {
@Override
public void make() {
System.out.println("制造宝马飞机");
}
}
public class PorschePlane implements Plane {
@Override
public void make() {
System.out.println("制造保时捷飞机");
}
}
下面修改工厂相关的类
public interface AbstractFactory {
Car makeCar();
Plane makePlane();
}
public class BmwFactory implements AbstractFactory{
@Override
public Car makeCar() {
return new BmwCar();
}
@Override
public Plane makePlane() {
return new BmwPlane();
}
}
public class PorcheFactory implements AbstractFactory {
@Override
public Car makeCar() {
return new PorscheCar();
}
@Override
public Plane makePlane() {
return new PorschePlane();
}
}
public class Run2 {
public static void main(String[] args) {
//工厂
AbstractFactory bmwFactory = new BmwFactory();
AbstractFactory porscheFactory = new PorcheFactory();
//从工厂获取宝马对象
Car bmwCar = bmwFactory.makeCar();
Plane bmwPlane = bmwFactory.makePlane();
bmwCar.make();
bmwPlane.make();
//从工厂获取保时捷对象
Car porscheCar = porscheFactory.makeCar();
Plane porschePlane = porscheFactory.makePlane();
porscheCar.make();
porschePlane.make();
}
}
这里先讲一下产品等级结构和产品族的概念
然后讲一下三个工厂模式的区别