首页 > 其他分享 >单例模式

单例模式

时间:2023-10-01 16:56:41浏览次数:31  
标签:Singleton 对象 HungrySingle 模式 static 单例 public

什么是单例模式

  单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。

单例模式的类型

  懒汉式:在真正需要使用对象时才去创建该单例类对象。

  懒汉式创建对象的方法是在程序使用对象前,先判断该对象是否已经实例化(判空),若已实例化直接返回该类对象。,否则则先执行实例化操作。

package other;

public class LazySingle {

    private static LazySingle lazySingle = null;

    private LazySingle() {
} public static synchronized LazySingle getLazySingle() { if (lazySingle == null) {
        //线程安全问题
        synchronized(lazySingle.class){
          if (lazySingle == null) {
              lazySingle = new LazySingle();
            }
        } } return lazySingle; } }

  饿汉式

  饿汉式在类加载时已经创建好该对象,在程序调用时直接返回该单例对象即可,即我们在编码时就已经指明了要马上创建这个对象,不需要等到被调用时再去创建。

package other;

public class HungrySingle {

    private static final HungrySingle singleton = new HungrySingle();

    private HungrySingle(){

    }

    public static HungrySingle getSingleton(){
        return singleton;
    }
}

单例模式的优缺点

优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。

    2、避免对资源的多重占用(比如写文件操作)。

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

单例模式的破坏

无论是饿汉式还是懒汉式,都可以通过反射和序列化进行破坏(产生多个对象)

1.反射

public static void main(String[] args) {
    // 获取类的显式构造器
    Constructor<Singleton> construct = Singleton.class.getDeclaredConstructor();
    // 可访问私有构造器
    construct.setAccessible(true); 
    // 利用反射构造新对象
    Singleton obj1 = construct.newInstance(); 
    // 通过正常方式获取单例对象
    Singleton obj2 = Singleton.getInstance(); 
    System.out.println(obj1 == obj2); // false
}

2.序列化与反序列化

public static void main(String[] args) {
    // 创建输出流
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Singleton.file"));
    // 将单例对象写到文件中
    oos.writeObject(Singleton.getInstance());
    // 从文件中读取单例对象
    File file = new File("Singleton.file");
    ObjectInputStream ois =  new ObjectInputStream(new FileInputStream(file));
    Singleton newInstance = (Singleton) ois.readObject();
    // 判断是否是同一个对象
    System.out.println(newInstance == Singleton.getInstance()); // false
}

使用枚举来实现单例模式

public enum HungrySingle{
    INSTANCE;
}
class HungrySingleTest{
    public static void main(String[] args) {
        HungrySingle instance1 = HungrySingle.INSTANCE;
        HungrySingle instance2 = HungrySingle.INSTANCE;
        System.out.println(instance1 == instance2); //true
    }
}

枚举方式属于饿汉式方式

枚举类实现单例模式是极力推荐的单例实现模式,因为枚举是线程安全的,并且只会装载一次,枚举类是所有单例类实现中唯一不会被破坏的单例模式。

 

标签:Singleton,对象,HungrySingle,模式,static,单例,public
From: https://www.cnblogs.com/ywzh/p/17738984.html

相关文章

  • 【11.0】Fastapi的OAuth2.0的授权模式
    【一】OAuth2.0的授权模式授权码授权模式(AuthorizationCodeGrant)隐式授权模式(ImplicitGrant)密码授权模式(ResourceOwnerPasswordCredentialsGrant)客户端凭证授权模式(ClientCredentialsGrant)【二】密码授权模式【1】FastAPI的OAuth2PasswordBearer说明......
  • java 实现外观模式
    外观模式(FacadePattern)是一种结构型设计模式,它提供了一个简化的接口,用于访问一组相关的接口或子系统。外观模式的主要目的是隐藏复杂的系统结构,提供一个更简单的接口供客户端使用。以下是一个简单的Java示例,演示如何实现外观模式:首先,假设我们有一个音响系统,它包含了多个子系统,如音......
  • java 实现模板方法模式
    模板方法模式(TemplateMethodPattern)是一种行为型设计模式,它定义了一个算法的骨架,将具体的步骤延迟到子类中实现。模板方法模式使得子类可以重新定义算法的某些步骤,而不改变算法的结构。以下是一个简单的Java示例,演示如何实现模板方法模式:首先,定义一个抽象类Game,它包含一个模板方......
  • 访问者模式
    访问者模式案例引入要求1.将观众分为男生和女生,对歌手进行评价,当看完某个歌手表演后,对于歌手有不同的评价(评价的类别,有成功,失败等)。传统方式实现思路创建一个Person类,其有两个子类,分别是Man和WoMan,使用ifelse分支,去判断一个歌手的评价,成功对应成功分支,失败对应失败分支。......
  • java中观察者模式的简单实现
    4要素:1观察者接口2具体的观察者3管理者接口4管理者实现类5调用1观察者接口包含观察者行为方法publicinterfaceObserver{/***当目标类发生变化时所执行的操作**/StringdoSomething();}2具体的观察者//具体观察者A@Slf4j@Component("ObserverA")pu......
  • java实现策略模式
    策略模式(StrategyPattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装成单独的类,并使它们可以相互替换,以使算法的变化独立于客户端使用算法的方式。策略模式允许客户端选择不同的算法,以满足不同的需求。以下是一个简单的Java示例,演示如何实现策略模式:首先,定义一个策略接......
  • java实现观察者模式
    观察者模式(ObserverPattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生变化时,它的所有依赖者(观察者)都会收到通知并自动更新。观察者模式通常包括以下角色:主题(Subject)、观察者(Observer)、具体主题(ConcreteSubject)和具体观察者(ConcreteObserver)。以下是一......
  • java实现迭代器模式
    迭代器模式(IteratorPattern)是一种行为型设计模式,它提供一种方法来顺序访问一个聚合对象(如列表、集合、数组等)中的元素,而不暴露聚合对象的内部表示。迭代器模式通常包括以下角色:迭代器(Iterator)、具体迭代器(ConcreteIterator)、聚合(Aggregate)、具体聚合(ConcreteAggregate)。以下是一......
  • java实现解释器模式
    解释器模式是一种行为设计模式,它用于解释语言或表达式中的语法和语义。在解释器模式中,我们创建一个解释器类,该类包含解释表达式的方法,并为每种语法规则定义一个具体的表达式类。以下是在Java中实现解释器模式的一般步骤:创建一个抽象表达式类(AbstractExpression):该类定义了解释器的......
  • java实现中介者模式
    中介者模式是一种行为设计模式,它允许对象之间通过一个中介对象来进行交互,而不是直接相互引用。中介者模式有助于降低对象之间的耦合性,使系统更容易扩展和维护。以下是在Java中实现中介者模式的一般步骤:创建一个中介者接口(Mediator):该接口定义了各个同事类之间通信的方法。创建多个......