文章更新时间:2020/07/15
一、一句话背景
我需要一辆汽车,那我可以直接从工厂里面提货,而不用去管汽车是怎么做出来的,以及生产汽车的具体实现,我只需要告诉这个工厂要生产什么品牌的汽车就好,具体的汽车生产过程我也不用管。
二、使用场景
使用场景:知道部分特性而创建具体对象的场景。
如:根据环境类型(dev,test或master等)直接调用一整套环境配置
优点:
- 客户端不需要在负责对象的创建,明确了各个类的职责
- 如果有新的对象增加,只需要增加一个具体产品类和具体的工厂类即可
- 不会影响已有的代码,后期维护容易,增强系统的扩展性
缺点:
- 需要额外的编写代码,增加了工作量【额外编写具体工厂类和具体产品类】
与简单工厂的区别:
- 简单工厂:工厂类包含了具体的逻辑判断,增加类型时需要修改工厂类代码
- 工厂方法:工厂类只定义生成抽象产品的方法,增加类型时不需要修改原来的工厂类代码,但需要新增工厂类和实现工厂类的具体产品类。
三、模型分析
工厂:定义创建抽象产品的方法,由具体工厂去实现,生成具体产品
抽象产品:定义产品的共有属性和方法,由具体产品去继承
具体工厂:实现/继承工厂类,生产具体产品
具体产品:实现/继承抽象产品类
四、UML类图
五、代码分析
工厂
/** * 汽车工厂【工厂】 */ public interface CarFactory { /** * 生产汽车的方法 */ Car produceCar(); }
具体工厂
奥迪车工厂
/** * 奥迪车工厂【具体工厂】 */ public class AudiFactory implements CarFactory { @Override public Car produceCar() { //实现工厂接口定义的方法,生产奥迪车 return new AudiCar(); } }
奔驰车工厂
/** * 奔驰车工厂【具体工厂】 */ public class BenzFactory implements CarFactory { @Override public Car produceCar() { //实现工厂接口定义的方法,生产奔驰车 return new BenzCar(); } }
宝马车工厂
/** * 宝马车工厂【具体工厂】 */ public class BmwFactory implements CarFactory { @Override public Car produceCar() { //实现工厂接口定义的方法,生产宝马车 return new BmwCar(); } }
抽象产品
/** * 汽车【抽象产品】 */ public abstract class Car { /** * 驾驶 */ public abstract void drive(); }
具体产品
奥迪车
/** * 奥迪车【具体产品】 */ public class AudiCar extends Car { @Override public void drive() { System.out.println("奥迪车驾驶综合体验不错~~~"); } }
奔驰车
/** * 奔驰车【具体产品】 */ public class BenzCar extends Car { @Override public void drive() { System.out.println("奔驰车驾驶体验豪华平稳~~~"); } }
宝马车
/** * 宝马车【具体产品】 */ public class BmwCar extends Car { @Override public void drive() { System.out.println("宝马车驾驶体验运动感十足~~~"); } }
客户下单
/** * 工厂模式测试类【模拟下单】 */ public class FactoryTest { public static void main(String[] args) throws Exception { //客户要买“宝马”车,则我们实例化一个宝马工厂出来 CarFactory carFactory = new BmwFactory(); //调用工厂里生产汽车方法 Car car = carFactory.produceCar(); //开车车咯~~~ car.drive(); } }