Java——设计模式(单例模式、工厂者模式)
一、设计模式
什么是设计模式?
开发人员总结的一些比较优秀的规则,提高代码的可复用,以及性能。
就比如说(博主自己设想的):在以前的时候,还没有设计模式,随着需求的增加以及业务场景的实现,会发现有一些代码实现特定的功能场景非常好,代码简洁且性能高效,于是慢慢的便沿用下来。初学可能不懂相关场景的实现,但是随着以后实现不同的需求以及碰到不同的场景,会愈来愈理解这些设计模式。就好比小时候背古诗,那时不懂什么意思,即便懂也没有体会,但是每天都背古诗记忆深刻,随着时间的流逝,未来的某一天会突然理解到这些诗词句的含义。跟这是同样的道理。有一些优秀的东西,当时不一定懂,但是先记忆,日后派上用场的时候就会感谢昨日的积累。
1、单例模式
单例模式:有且仅实例化一个类。
有且仅实例化一次:
A.私有的属性 ==>只能本类进行访问
B.私有的构造
C.公有的方法(返回这个对象)
场景:
工具类的编写、框架管理对象的原则
分类:
单例设置模式的分类:1.饿汉 2.懒汉 3.双重锁 4.内部类 5.枚举
a、饿汉模式
1、优点:没有锁机制,加载速度比较快。 2、缺点:项目运行就直接加载,可能导致项目出现卡顿,用户体验度比较差。
public class Hungry_man {
private static Hungry_man hungry_man = new Hungry_man();
private Hungry_man(){
}
public static Hungry_man getHungry_man() {
return hungry_man;
}
}
看上面代码可以得知,上来就直接私有静态,且直接实例化一个对象。构造方法也是私有的。可以说内部相当封闭的了。下面定义一个公有静态的方法,通过外部调用到内部的东西。
b、饱汉模式
1.优点:懒加载,随用随加载。(用的时候才加载,用不到的时候,即便代码在,也不会使用) 2.缺点:在多线程中是不安全的。
public class DateUtils {
private static DateUtils dateUtils;
private DateUtils(){
}
public static synchronized DateUtils getInstance(){
if (dateUtils ==null){
dateUtils = new DateUtils();
}
return dateUtils;
}
}
}
学过前面同步锁的可以知道,这里不安全的。多线程不安全,加个同步锁就安全了。
c、双重锁模式
通过设置两个锁,来保证线程安全。但是博主听说设置一个锁就差不多了。如果确实需要线程安全,还是设置两个锁吧。
public class DateUtils {
private static DateUtils dateUtils;
private DateUtils(){
}
public static synchronized DateUtils getInstance(){
synchronized (DateUtils.class){
if (dateUtils ==null){
dateUtils = new DateUtils();
}
return dateUtils;
}
}
}
d、内部类模式
public class DateUtils2 {
private DateUtils2(){
}
private static class Holder{
private static final DateUtils2 d = new DateUtils2();
}
public static DateUtils2 getInstance(){
return Holder.d;
}
}
2、工厂者模式
顾名思义,需要什么的时候,就会拿那个东西。
a、分析
b、实现代码
工厂者模式,用到的就是前面学到的多态。
准备更新。
|