Java中的二十三种设计者模式
作者:互联网
创建型模式
1.单例模式
概念:单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类只有一个实例。即一个类只有一个对象实例。
实例:Java单例模式的七种写法
//1.懒汉,线程不安全
public static Singleton{
private static Singleton instance;
private Singleton(){
}
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instace;
}
}
//2.懒汉,线程安全
//这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾额是,效率很低,99%情况下不需要同步。
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
//第三种(饿汉)
//这种方式基于classloder机制,在深度分析Java的ClassLoader机制(源码级别)和Java类的加载、连接和初始化两个文章中有关于Classload而机制的线程安全问题的介绍,避免了多线程的同步问题,不过,instance在类加载时就实例化,虽然导致类加载的原因有很多种,在单例模式中大多数都是调用getInstance方法,但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。
public class Singleton{
private static Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstabce(){
return instance;
}
}
//第四种(饿汉,变种)
//表面看起来差别挺大,其实更第三种方式差不多,都是在类初始化即实例化instance。
public class Singleton{
private Singeton intance=null;
static{
instance=new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
//第五种(静态内部类)
//这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它跟第三种和第四种方式不同的是(很细微的差别):第三种和第四种方式是只要Singleton类被装载了,那么instance就会被实例化(没有达到lazy loading效果),而这种方式是Singleton类被转载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。想像一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,我不希望在Singleton类加载时就实例化,因为我不确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比第三和第四种方式就显的很合理。
public class Singleton{
private static class Singletonlder{
private static final Singleton INSTANCE=new Singleton();
}
private Singleton(){}
public static final Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
//第六种(枚举)
//这种方式是Effective Java作者Josh Bloch提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,在深度分析Java的枚举类型---枚举的线程安全性及序列化问题中有详细介绍枚举的线程安全问题和序列化问题,不过,个人认为由于1.5才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。
public enum Singleton{
INSTANCE;
public void whateverMethod(){
}
}
//第七种
public class Singleton{
private volatile static Singleton singleton;
private Singleton(){}
public static Singleton getSingleton(){
if(singleton==null){
synchronized(Singleton.class){
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
}
2.工厂模式
概念:
工厂模式(Factory Pattern)是Java中最常用的设计模式之一。这种类型的设计模式属于创建型模式,他提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
https://www.runoob.com/design-pattern/factory-pattern.html
3.抽象工厂模式
4.建造者模式
5.原型模式
结构型模式
6.设配器模式
7.桥接模式
8.过滤器模式
9.组合模式
10.装饰器模式
11.外观模式
12.享元模式
13.代理模式
行为型模式
14.责任链模式
15.命令模式
16.解释器模式
17.迭代器模式
18.中介者模式
19.备忘录模式
20.观察者模式
21.状态模式
22.空对象模式
23.策略模式
24.模板模式
25.访问者模式
标签:Singleton,Java,二十三,模式,instance,static,private,设计者,public 来源: https://blog.csdn.net/weixin_43723527/article/details/109995464