GOF23学习笔记(三)工厂模式

工厂模式

实现创建者与调用者的分离。关注产品,不关注细节。

学习工厂模式之前,我们先来了解一个面向对象设计的基本原则

OCP(开闭原则,Open-Closed Principle):一个软件的实体应该对扩展开放,对修改关闭。(也就是说,如果我有一个类实现了一部分功能,现在我想添加一个功能,最好通过一个一个新的类来实现,而不是修改已有的类)

工厂模式的核心本质

-实例化对象:用工厂方法代替new操作。

-将选择实现类,创建对象,统一管理和控制。从而将调用者跟我们的实现类解耦。

工厂模式的三种实现方式

1、简单工厂模式:也叫静态工厂模式,用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改已有代码)

车接口

public interface Car {
	public void run();
}

实现车接口的两个产品

public class Audi implements Car{
	@Override
	public void run() {
		System.out.println("奥迪在跑");
	}
}

public class BMW implements Car{
	@Override
	public void run() {
		System.out.println("宝马在跑");	
	}
}

工厂类

public class CarFactory {
	public static Car createCar(String type) {
		if (type.equals("Audi")) {
			return new Audi();
		}else if(type.equals("BMW")) {
			return new BMW();
		}else {
			return null;
		}
	}
}

调用类

GOF23学习笔记(三)工厂模式_第1张图片

这样我们不难看出,调用者想要得到某一种车,不需要和该车的实体类打交道,只需要告诉工厂类,我需要哪一辆车,工厂类负责生产出来,我们不需要去关心这个实例是怎么创建的。

但是,这里有一个问题,就是我上文提到的,简单工厂模式不完全满足OCP原则,如果我要新增一个产品,比如奔驰车,那么我的工厂类代码就要进行修改。不修改,是没有办法新增产品的。所以为了完全满足OCP原则,我们引入第二种工厂模式。

2、工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)

车接口以及其实现类都与简单工厂模式一样,工厂方法模式与简单工厂模式最大的不同就是,简单工厂模式只有一个工厂类(对于一个项目或者一个独立的模块而言),而工厂方法模式拥有一组实现了相同接口的工厂类。

工厂接口

public interface CarFactory {
	public Car createCar();
}

工厂接口的实现类,不同的工厂生产其对应的产品

public class AudiFactory implements CarFactory{

	@Override
	public Car createCar() {
		return new Audi();
	}

}


public class BMWFactory implements CarFactory{

	@Override
	public Car createCar() {
		return new BMW();
	}
	
}

调用类

GOF23学习笔记(三)工厂模式_第2张图片

通过工厂方法模式,我们能做到,假如要新增一个奔驰产品,我只需要新建奔驰类实现Car,新建奔驰工厂实现CarFactory就可以实现,这就满足了OCP原则,我们并没有对原有代码进行修改便实现了。

不过我们在实际开发中,使用较多的依旧是简单工厂模式。因为工厂方法模式有多个工厂类,这就导致了工厂方法模式比简单工厂模式的结构更加复杂。在一个,新增产品上,虽然简单工厂模式不完全满足OCP原则,但是它也只需要修改工厂类的代码,相对简单。

并且,我们有一个更加简单的方式来解决简单工厂模式不完全满足OCP原则的缺陷。那就是利用Java反射机制,来实现的简单工厂模式。

实现类

public class CarFactory2 {
	public static Object createCar(String className) throws Exception {
		Class clazz = Class.forName(className);
		Object object = clazz.newInstance();
		return object;
	}
}

调用类

GOF23学习笔记(三)工厂模式_第3张图片

这样,新增产品就不需要再去修改工厂类,只需要在调用类中传递类的路径便可。

3、抽象工厂模式:用于生产不同产品族的全部产品(对于增加新产品,无能为力,支持增加产品族)

抽象工厂模式是工厂方法模式得升级,在有多个业务品种,业务分类时,使用该方法

车有引擎,座椅,轮胎

public interface Engine {
	void run();

	void start();
}
//实现类,高级引擎和低端引擎
class LuxuryEngine implements Engine {
	@Override
	public void run() {
		System.out.println("转的快");

	}

	@Override
	public void start() {
		System.out.println("启动快");

	}
}
class LowEngine implements Engine {

	@Override
	public void run() {
		System.out.println("转的慢");

	}

	@Override
	public void start() {
		System.out.println("启动慢");

	}

}

工厂接口

public interface CarFactory {
	Engine createEngine();
	Seat createSeat();
	Tyre createTyre();
}
生产高级和低端的工厂实现类


//高端
public class LowCarFactory implements CarFactory{

	@Override
	public Engine createEngine() {
		return new LowEngine();
	}

	@Override
	public Seat createSeat() {
		return new LowSeat();
	}

	@Override
	public Tyre createTyre() {
		return new LowTyre();
	}

}
//低端
public class LuxuryCarFactory implements CarFactory{

	@Override
	public Engine createEngine() {
		return new LuxuryEngine();
	}

	@Override
	public Seat createSeat() {
		return new LuxurySeat();
	}

	@Override
	public Tyre createTyre() {
		return new LuxuryTyre();
	}

}

调用类

GOF23学习笔记(三)工厂模式_第4张图片

你可能感兴趣的:(设计模式)