前两篇博客阅读量不行,让自己反思是不是博客质量不行呢,文字功底不行呢?算了不管这些东西了,反正我写博客也是为了提高、总结自己,无其他!
今天这篇博客我想要来写一写设计模式里面的工厂模式,其实说到工厂模式大家应该不会陌生。的确,在笔者还是个菜鸟的时候,还不理解设计模式到底是用来干什么的时候,工厂模式的大名就已经入耳。那么工厂模式到底是用来干什么的呢?在代码层面应该怎样来写呢?下面就让笔者通过一个例子来加以说明。
假设在一个汽车工厂里面可以同时生产宝马、奔驰、奥迪,当然心情好的话,也是可以扩展业务生产些兰博基尼、玛莎拉蒂什么的。我们先别管这家神奇的工厂有没有这个生产实力,我们在这里只管它的业务范围。假设每辆汽车的出厂标准都是具有属性速度、颜色、型号,具有方法驾驶、刹车。下面就让我们通过代码来模拟一下这个场景,首先肯定需要申明一个接口Car,定义如下:
public interface Car{ int getColor(); float getSpeed(); String getModel(); void run(); void stop(); }
接下来我们肯定通过上面的接口来扩展出宝马、奔驰、奥迪等车型了,代码如下:
public class BMW implements Car { @Override public void run() { System.out.println("宝马开始跑..."); } @Override public void stop() { // TODO Auto-generated method stub System.out.println("宝马刹车..."); } @Override public int getColor() { // TODO Auto-generated method stub return Color.red; } @Override public float getSpeed() { // TODO Auto-generated method stub return 60; } @Override public String getModel() { return "BMW"; } }
public class Benzimplements Car { @Override public void run() { System.out.println("奔驰开始跑..."); } @Override public void stop() { // TODO Auto-generated method stub System.out.println("奔驰刹车..."); } @Override public int getColor() { // TODO Auto-generated method stub return Color.black; } @Override public float getSpeed() { // TODO Auto-generated method stub return 70; } @Override public String getModel() { return "Benz"; } }
public class Audi implements Car { @Override public void run() { System.out.println("奥迪开始跑..."); } @Override public void stop() { // TODO Auto-generated method stub System.out.println("奥迪刹车..."); } @Override public int getColor() { // TODO Auto-generated method stub return Color.blue; } @Override public float getSpeed() { // TODO Auto-generated method stub return 80; } @Override public String getModel() { return "Audi"; } }
通过上面的代码我们就已经定义好了三种车型,接下来我们就应该考虑该如何进行生产了。有两种常做的办法:1.当我们需要哪个车型的时候,就直接new;2.就是通过工厂模式,进行生产;当然最优的方法肯定是工厂模式了,为什么?采用new的方法进行生产,肯定就违反了迪米特原则,整个代码体系里面就缺少一个高内聚性,每当我需要一个车型就得找到这个车型new。而工厂模式呢,可以很好的为我们解决这个弊端。下面就让我们来看看,工厂模式的代码,首先声明一个抽象的车型工厂:
public abstract class AbstractCarFactory { public abstract <T extends Car> T createCar(Class<T> c); }
然后实现一个真正的生产工厂,代码如下:
public class CarFactory extends AbstractCarFactory { @Override public <T extends Car> T createCar(Class<T> c) { Car car=null; try{ car=(T)Class.forName(c.getName()).newInstance(); }catch(Exception e){ System.out.println("汽车生成错误"); }
return (T)car; } }
最后我们就可以调用该工厂类进行车型的生产制造了,代码如下:
public static void main(String[] args) { // TODO Auto-generated method stub AbstractCarFactory carFactory=new CarFactory(); Car bmwCar= carFactory.createCar(BMW.class); bmwCar.run(); bmwCar.stop(); Car benzCar=carFactory.createCar(Benz.class); benzCar.run(); benzCar.stop(); Car audiCar=carFactory.createCar(Audi.class); audiCar.run(); audiCar.stop(); }
通过上面的代码,可以发现生产新的车型将变得非常简单,我们只要扩展新的Car,然后在main方法里面传入对应的类名即可。通过应用工厂模式,可以很好的降低代码之间的耦合,同时也符合6大原则里面迪米特原则、依赖倒置原则。下面让我们来看看工厂模式的扩展:简单工厂模式,多个工厂模式,替代单例模式,延迟初始化。
简单工厂模式:就是上面的抽象工厂类去掉,同时将里面的创建类移到真正的工厂类里面;
多个工厂模式:就是将工厂类进行拆分,不同的工厂类只生产一种产品;
替代单例模式:应该很好理解了;
延迟初始化:当我们需要一个对象的时候,才会去调用工厂进行初始化;
好了,今天的博客就到这里了。如果有什么不对的地方欢迎大家拍砖,后续有时间我也会继续更新。