show me the code and take to me,作的出来更要说的明白
GitHub项目 JavaHouse同步收录
喜欢就点个赞呗! 你的支持是我分享的动力!
咱们常常听到工厂模式,好比说 Spring 用了工厂模式啦,面试也会被问到工厂模式等等,这见工厂模式是平常开发中比较重要的一种设计模式。其实工厂模式也是比较简单的一种设计模式,这年头彷佛不了解工厂模式,你都很差意思说你学过 编程同样(手动狗头)。那么,容许我灵魂拷问一下,你真的了解工厂模式吗。java
不急,咱们先看看 UML 类图。学习一下怎么用 UML 类图 表示代码。先看如何表示一个实体类。代码以下:git
public class B { private String name; private String password; public void test(){ } }
这是一个简单的实体类。他的 看 UML 类图以下:github
看完实体类,咱们在来看看接口,代码以下:面试
public interface B { void test(); }
这是一个简单的接类。通常接口就放几个方法,不放属性。他的 看 UML 类图以下:编程
看完实体类和接口,咱们来看看他们有什么关系吧。先看看继承关系如何表示:设计模式
能够一眼看到他的箭头特色---空心的。箭头指向父类。这就是继承关系表示。微信
看完继承关系,咱们在看看实现接口如何表示。ide
这里咱们能够看到与继承关系相似,不过实现变成虚线,箭头指向接口类。post
完了没有,没有,咱们在看看依赖关系,这种关系比较弱,通常是一个类做为另外一个类的参数表示, uml 图以下:学习
依赖关系是虚线,半个箭头
到这里,以上就是常见的 uml 类图表示。
进入正题,什么是工厂模式,咱们先看看简单工厂模式,其实简单工厂模式并非工厂模式,可是他能够帮助咱们去了解工厂模式,因此咱们先看看简单工厂模式。
需求:咱们须要作一个能够加减乘除的计算机,运用到简单工厂模式。
UML 类图:
运算类:
import lombok.Data; @Data public abstract class Operation { private Double numA; private Double numB; /** * 运算方法 */ abstract Double getResult(); }
加法类:
public class OperationAdd extends Operation{ @Override Double getResult() { return getNumA() + getNumB(); } }
乘法类:
public class OperationMul extends Operation{ @Override Double getResult() { return getNumA() * getNumB(); } }
除法类:
public class OperationDiv extends Operation{ @Override Double getResult() { if (getNumB() == 0){ throw new RuntimeException("除数不能为零!"); } return getNumA() / getNumB(); } }
简单工厂类:
public class CreateOperationFactory { public static Operation createOperation(String operate){ Operation operation = null; switch (operate){ case "+": operation = new OperationAdd(); System.out.println("这是+法"); break; case "/": operation = new OperationDiv(); System.out.println("这是/法"); break; case "*": operation = new OperationMul(); System.out.println("这是*法"); break; } return operation; } }
测试类:
public class Test { public static void main(String[] args) { Operation operation = CreateOperationFactory.createOperation("+"); operation.setNumA(1D); operation.setNumB(2D); System.out.println(operation.getResult()); operation = CreateOperationFactory.createOperation("*"); operation.setNumA(1D); operation.setNumB(2D); System.out.println(operation.getResult()); operation = CreateOperationFactory.createOperation("/"); operation.setNumA(1D); operation.setNumB(2D); System.out.println(operation.getResult()); } }
输出接口:
这是+法 3.0 这是*法 2.0 这是/法 0.5
需求:要再添加一个减法运算,嗯?上面没有减法运算吗?我猜大家确定没有发现上面没有减法运算。看到的也会觉得我在偷懒了,蒙混过关呢。事情并无这么简单。
通常来讲,加个减法嘛,简单,我直接就下 工厂类里面加一个分支不就完事了。哈哈,却不知,这时候,咱们已经违反一个重要的原则--开放关闭原则。所谓开放关闭原则,咱们不该该修源码,祖传代码你敢动,试试看,而是经过继承父类或者实现接口去拓展代码,达到咱们的目的。
uml 类图:
代码以下:
public interface IFactory { Operation createOperation(String operate); } public class OperationAddFactory implements IFactory{ @Override public Operation createOperation(String operate) { Operation operation = new OperationAdd(); System.out.println("这是+法"); return operation; } }
没错,这里是本身杠本身的环节。
什么工厂模式啊!我本身 new
一个对应的对象不就解决问题了,为啥要写一个工厂类出来。(杠上杠啊,这是要搞事情)
嗯?好像我没法反驳·····是不存在的(用我第三根手指推一推个人眼镜)。试想一下,一个地方用到就去 new
一下。咱们一下new
了十几个地方,而后发现要来类名,这时候,怎么办。一处一处改咯,本身new
的对象,哭着也要改完。可是若是用工厂类的话,咱们只须要改一个地方就能够,就是这么简单。
就这一个优势吗?我仍是喜欢一个一个new
啊。
确定不是(这是一个杠精啊),固然简单一个new
对象,确实不须要写一个类出来。可是new
一个对象并非那么简单,咱们须要对象进行一个操做呢。Spring IOC机制默认建立对象是单例的,那么咱们如今也须要对象是惟一的怎么办。这时候,咱们就是能够在工厂类里面写一个单例模式,达到咱们的目的。
以上就是个人抬杠环节。
无论什么设计模式,其实就是为了代码复用,少写代码,咱们作明白什么模式是什么模式,更要理解这些的做用。正所谓,武术的目的是为了生发,战争的出发点是为了和平。总之,就是知其然知其因此然。
看到这里的都是人才。
https://juejin.im/post/5d318b...
《大话设计模式》
https://www.zhihu.com/questio... -- 工厂设计模式有什么用?