什么是工厂模式
大家在开发中应该都应用过或者看到过SqlSessionFactory或者BeanFactory,这就是应用工厂模式来生产对象。工厂模式用于封装和治理对象的创立,拆散对象的创建者和调用者,实现与对象解耦的目标。
工厂模式能够分为:
- 简略工厂
- 工厂办法
- 形象工厂
实现形式
简略工厂
简略工厂通过接管的参数的不同来返回不同的对象实例,波及到的角色有:
- 形象产品
- 具体产品
- 具体工厂
- 调用者
代码如下:
// 形象产品public interface Car { void run();}// 具体产品1public class Audi implements Car { @Override public void run() { System.out.println("audi run"); }}// 具体产品2public class Benz implements Car{ @Override public void run() { System.out.println("benz run"); }}// 具体工厂,用于生成产品public class SimpleFactory { // 形式1,依据传入的参数生成对应的产品对象 public static Car getCar(String type){ if ("audi".equals(type)){ return new Audi(); } else if ("benz".equals(type)){ return new Benz(); } else { return null; } } // 形式2,间接调用生成对应的产品对象的办法 public static Car getAudi(){ return new Audi(); } public static Car getBenz(){ return new Benz(); }}// 调用者public class SimpleFactoryTest { public static void main(String[] args) { // 没有应用简略工厂,那么客户端就须要和接口Car以及其实现类打交道// Car audi = new Audi();// Car benz = new Benz();// audi.run();// benz.run(); // 应用简略工厂,形式1 Car audi = SimpleFactory.getCar("audi"); Car benz = SimpleFactory.getCar("benz"); audi.run(); benz.run(); System.out.println("============"); // 应用简略工厂,形式2 Car audi1 = SimpleFactory.getAudi(); Car benz1 = SimpleFactory.getBenz(); audi1.run(); benz1.run(); }}
类图如下:
能够看到,如果再减少一种产品,则须要批改工厂类,故这种工厂模式实用于产品对象较少,且产品固定的需要 。其实咱们在个别的我的项目中应用简略工厂就足够了。
工厂办法
为了防止简略工厂不满足开闭准则的毛病,减少产品而不须要去批改工厂类,能够应用工厂办法模式,减少产品的同时通过减少一个对应的工厂类来生产对应的产品,波及的角色有:
- 形象产品
- 具体产品
- 形象工厂
- 具体工厂
- 调用者
代码如下:
// 形象产品public interface Car { void run();}// 具体产品1public class Audi implements Car { @Override public void run() { System.out.println("audi run"); }}// 具体产品2public class Benz implements Car { @Override public void run() { System.out.println("benz run"); }}// 形象工厂public interface CarFactory { Car createCar();}// 具体工厂1public class AudiFactory implements CarFactory { @Override public Car createCar() { return new Audi(); }}// 具体工厂2public class BenzFactory implements CarFactory { @Override public Car createCar() { return new Benz(); }}// 调用者public class FactoryMethodTest { public static void main(String[] args) { Car audi = new AudiFactory().createCar(); Car benz = new BenzFactory().createCar(); audi.run(); benz.run(); }}
类图如下:
能够看到,如果新减少一种具体产品,就须要为其减少一个具体工厂类用于生产该产品。
形象工厂
形象工厂用于生产一族产品。波及的角色有:
- 形象产品
- 具体产品
- 形象工厂
- 具体工厂
- 调用者
代码如下:
// 形象产品Apublic interface Engine { void autoStart();}// 具体产品A1public class HighEngine implements Engine { @Override public void autoStart() { System.out.println("高端发动机有主动启停性能"); }}// 具体产品A2public class LowEngine implements Engine { @Override public void autoStart() { System.out.println("低端发动机没有主动启停性能"); }}// 形象产品Bpublic interface Tyre { void monitor();}// 具体产品B1public class HighTyre implements Tyre { @Override public void monitor() { System.out.println("高端轮胎有胎压监控性能"); }}// 具体产品B2public class LowTyre implements Tyre { @Override public void monitor() { System.out.println("低端轮胎无监控胎压性能"); }}// 形象工厂public interface CarFactory { Engine createEngine(); Tyre createTyre();}// 具体工厂A1B1public class HighCarFactory implements CarFactory { @Override public HighEngine createEngine() { return new HighEngine(); } @Override public HighTyre createTyre() { return new HighTyre(); }}// 具体工厂A2B2public class LowCarFactory implements CarFactory { @Override public LowEngine createEngine() { return new LowEngine(); } @Override public LowTyre createTyre() { return new LowTyre(); }}// 调用者public class AbstractFactoryTest { public static void main(String[] args) { CarFactory highCar = new HighCarFactory(); highCar.createEngine().autoStart(); highCar.createTyre().monitor(); }}
类图如下:
能够看到通过具体工厂A1B1和A2B2能够生产出不同的产品族,在产品固定的状况下,能够通过新增具体工厂类,来组合生成不同的产品族,比方A1B2或者A2B1。然而如果要减少新的产品的话,比方减少产品C,那就须要去批改形象工厂和具体工厂,就不适宜了。
欢送关注我的公众号,一起学习技术。