写在前面(如有不足或者错误的地方,希望大家指出,共同进步)
好!我是Whim,帝都的一个小小java,从业三年(其实是两年多一点,但说两年是不是亏了(手动滑稽)),在进阶过程中,可能有的知识点刚学的时候印象会比较深刻,但是大家都明白,应该没有一个公司或者说一个岗位会让你经常用到所有学过的东西,但需要用的时候你得能拿出来,所以萌生了我开始写博客,使用最能激到我的点的描述语句,记录自己的学习之路,也希望给有缘看到的技术工程师们,有那么一点点的帮助。
创建型设计模式
创建型设计模式大概分为以下几类:
- 工厂模式 ;
- 原型模式 ;
- 构建者模式 ;
- 单例模式 ;
注:一般创建型设计模式,大多用来做业务bean,很少的构建者可能会用来做数据bean!!!
工厂模式
为了从某种意义上相同的bean,才可以称之为工厂
工厂模式又可以细分为:
1:简单工厂–>例如spring,用的就是简单工厂模式
2:工厂方法
3:抽象工厂
简单工厂
这种设计模式是一种很神奇的设计模式,如果你单单使用它的基础用法,这个玩意实在是太不好用了;
基础用法,只要给它一个字符串,它就可以给你一个对象。
createBean方法中接入参string类型的name,根据name对比到类名,直接实例化返回就可以了。
例: public Object creatTest(String name){
if(name.equalsIgnoreCase("D")){
return new D();
}else if(name.equalsIgnoreCase("E")){
return new E();
}
return null;
}
缺点:
1:违反了开闭原则,不利于扩展和维护
2:入参不明确
3:简单工厂老得加else if 这谁受得了呀?
改进方案:
1:spring用了xml配置,建立了映射,就不用单独写new了
2:入参不明确,就把入参固定设置为查找对象的类名呗
3:通过对象名称,去Map集合中直接查找,省去多余的代码
工厂方法
工厂方法模式说白了就是我先声明一个抽象类或者接口,告诉我的子类工厂,你这个方法能干啥,也
就是定义标准教给大家(其子类),--->自己去建工厂,我给你三规!!!
缺点:
你需要A 产品,你就去A工厂拿
你需要B产品,你就去B工厂拿
个人感觉:这个东西真的不好用(手动捂脸)
抽象工厂
抽象工厂模式和工厂方法,想差不大,也是在定义标准;
区别在于工厂方法正对于某一个bean,也就是一个真正的工厂产生的是特定的bean
A 工厂产生A ---- B 工厂产生B
抽象工厂是多种bean,一个真正的工厂可以产生多种bean
比如手机:
A 工厂产生A 的屏幕bean、A 的摄像头bean。。。。
B工厂产生B的屏幕bean、B的摄像头bean。。。。
原型模式
1:浅克隆
2:深克隆
浅克隆(原型)
重点在于要实现Conleable,然后想要克隆的bean的类增加一个clone方法,直接调用super的clone方法,
当然这个clone方法其实是native方法!
注:此模式慎用!!!!! ,因为你要clone的类中如果有成员变量的类型是自定义类,A对象克隆之后的B对象,克隆前后的两个对象中的此成员变量的引用地址是同一个,也就是说 你更改了A 对象的此成员变量,B对象的此成员变量会发生响应的更改!!!!!!!!!!!!!!!!!!!!!!!!!!!!
深克隆(原型)
实现Serializable接口,使用字节流读写,完全克隆出一个新的对象
构建者模式
build,一般用来创建特殊的bean,用此设计模式的地方很多,比如mybatis中的XMLStatementBuilder,映射文件中的一个crud标签,对应一个mapperstatement。
特点:
1:创建对象之前,先new一个他的构建者--创建A 先new Abuild();
2:构建者中含有私有成员变量A,也就是真正需要的对象
3:构建者中提供为私有成员变量的属性赋值一系列方法
优势:
不会像构造方法一样,每个属性都需要传,即使为null也要传null
在真正调用build()方法之前,私有的成员变量对象,不会被暴露