Java设计模式之工厂模式(Factory)
前言:
前面学习了建造者设计模式,接下来学习一下Retrofit中使用的另外一个设计模式,工厂设计模式!!!里面采用工厂模式使得数据转换得到完全解耦,工厂模式的好处用到了极致,如此好的设计模式我们怎能不学习一下。
工厂模式:
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
1.)工厂模式分类:
- 简单工厂模式(Simple Factory)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
2.)简单工厂模式
见名知意,简单的工厂模式,建立一个工厂来制造新的对象,又叫静态工厂。举例说明李先生去4s店要买一部轿车, 如何实现?
1. 首先4s签单一部车Car
public class Car { public Car() { Log.e("car", "Car---->我要买车"); } }
2.然后4s店通知CarFactory 工厂生产
public class CarFactory { public static Car createCar() { return new Car(); } }
3.最后按时生产完毕的话将交付给李先生
Car car = CarFactory.buildCar();
整个过程李先生一点不清楚整个轿车的制造过程的情况买到一辆车,通过工厂模式 使得需求和实现解耦。由于工人放假,4s店没有按时交车导致违约,再加上李先生是个多变的人执意退车,而且选择不买轿车了,要买一辆suv,这可急死了销售顾问小王,
接下来小王是怎么留住李先生的呢?
4.销售赶紧通知工厂改造生产线能够支持生产多种车型,涵盖轿车、Suv、Mpv等
public class CarFactory { public enum CarType { SUV,//多功能越野车 MPV//多功能商务车 } public static Car createCar() { return new Car(); } public static Car createCar(CarType type) { Car car = null; switch (type) { case SUV: car = new SuvCar(); break; case MPV: car = new MpvCar(); break; default: car = new Car(); break; } return car; } }
SuvCar
public class SuvCar extends Car { public SuvCar() { Log.e("car", "SuvCar---->Suv"); } }
MpvCar
public class MpvCar extends Car { public MpvCar() { Log.e("car", "MpvCar---->Mpv"); } }
5. 最终4s按时交付了李先生的suv
Car suvCar = CarFactory.createCar(CarFactory.CarType.SUV);
改造工厂之后销售顾问小王的业绩蒸蒸日上,但是好景不长,问题又来了,由于在同一个工厂开发不同的车型导致管理混乱,质量严重不过关,工厂还进行了大量召回和赔偿。接下来公司决定对工厂进行整改。如何整改接下来我们来看工厂方法模式
3.)工厂方法模式
通过上面的简单工厂模式可以看出,其实简单的工厂模式看似用来简单,但是不利于扩展和维护,稍有不慎就有很大的麻烦,鉴于这个原因我们来看下工厂方法模式,工厂方法为工厂类定义了接口或者抽象类,用多态来分配每个子工厂类的职能,还是接着上面的例子来说明。
1.工厂老板重新定义了公司产品对象就是造车
public interface ICarFactory { //造车 Car createCar(); }
2.整理产品线,建造两大整车厂分别生产suv、mpv车型
SuvCarFactory
public class SuvCarFactory implements ICarFactory{ @Override public Car createCar() { return new SuvCar(); } }
MpvCarFactory
public class MpvCarFactory implements ICarFactory{ @Override public Car createCar() { return new MpvCar(); } }
3.这样就可以满足不同的用户
SuvCarFactory suvCarFactory = new SuvCarFactory(); Car suvCar = suvCarFactory.createCar(); MpvCarFactory mpvCarFactory=new MpvCarFactory(); Car mpvCar=mpvCarFactory.createCar();
4.)抽象工厂方法
抽象工厂:意的意图在于创建一系列互相关联或互相依赖的对象,还是接着上面的例子举例说明,由于车市不景气,国家出台了1.6排量及以下的购置税减半,工厂决定一辆suv出两个版本 一个200T一个300T该如何解决呢?这里就用到抽象工厂方法。
1.宣布调整工厂生产产品对象
public interface AbstractCarFactory { //制造发送机 Engine createEngine(); //造车 Car createCar(); }
Engine类
public class Engine { public Engine() { Log.e("Engine", "Engine---->我是发送机"); } }
Engine200T类
public class Engine200T extends Engine { public Engine200T(){ Log.e("Engine", "Engine---->我是200T发动机"); } }
Engine300T类同上
2.调整产品线以suv200T 、suv300T举例
public class SuvCar200TFactory implements AbstractCarFactory { @Override public Engine createEngine() { return new Engine200T(); } @Override public Car createCar() { return new SuvCar(); } }
300T同上不再写
3.产品输出
SuvCar200TFactory suvCar200TFactory =new SuvCar200TFactory(); suvCar200TFactory.createEngine(); suvCar200TFactory.createCar();
从举例可以看出工厂方法和工厂抽象的区别在于工厂抽象实现了一系列有关联产品的创建。