这篇博客将详细的介绍一下工厂模式。
参考资料
模式的秘密——工厂模式 工厂模式
基础知识
简单工厂模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 package com.redisc;import lombok.extern.slf4j.Slf4j ;abstract class Car { abstract void run(); } class BMW extends Car { @Override void run() { System .out.println("BMW" ); } } class BC extends Car { @Override void run() { System .out.println("BC" ); } } class CarFactory { public Car getCar(String carName) { Car car = null ; if (carName.equals("BC" )) { car = new BC (); } else if (carName.equals("BMW" )) { car = new BMW (); } return car; } } @Slf 4j(topic = "c.Test" )public class Run { public static void main(String [] args){ new CarFactory ().getCar("BC" ).run(); } }
通过一个工厂方法,传入参数来获取不同的 car
对象。
工厂方法模式
简单工厂模式,有一个不好的地方,假如,又来了一个新的 car
,你必须还要去修改 CarFactory
方法。
所以,可以通过给每一个 car 都创建一个工厂。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 package com.redisc;import lombok.extern.slf4j.Slf4j;abstract class Car { abstract void run () ; } interface CarFactory <T > { T getCar () ; } class BMW extends Car { @Override void run () { System.out.println("BMW" ); } } class BMWFactroy implements CarFactory <BMW > { @Override public BMW getCar () { return new BMW(); } } class BC extends Car { @Override void run () { System.out.println("BC" ); } } class BCFactroy implements CarFactory <BC > { @Override public BC getCar () { return new BC(); } } @Slf 4j(topic = "c.Test" )public class Run { public static void main (String[] args) { new BCFactroy().getCar().run(); } }
看到上面的代码,你可能会产生以下疑问
每个 car
都创建一个工厂,那不是冗余了吗
这和直接 new car
有什么区别
冗余 代码确实是多了,但是,却解耦了。之前的简单工厂,每创建一个 car
都需要改变工厂方法。如果,工厂方法中用的是非常复杂的逻辑,后面每一个改动对维护都是非常致命的。
直接 new 不直接 new
的好处,就是,工厂方法隔离了具体类的实现,使得用户不需要关心具体是什么车。比如,BWM
下面又分为有天窗没天窗的,可以通过工厂方法进行合适的拼装。
抽象工厂模式
这个直接看 抽象工厂模式
其本质就是在工厂模式的情况下,又加了一层超级工厂。有的工厂管理手机,有的管理路由器,而抽象工厂是管理手机工厂和路由器工厂的。