IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 软件设计模式--第二章 创建型模式-- 单例模式 -> 正文阅读

[Java知识库]软件设计模式--第二章 创建型模式-- 单例模式


第二章 创建型模式

1、创建型模式概述

  • 主要特点
    对象的创建与使用分离”,这样可以降低系统的耦合度。

  • 创建型模式分为以下几种:
    单例(Singleton)模式 :某个类只能生成一个实例,该类提供了一个全 局访问点供外部获取该实例,其拓展是有限多例模式。
    原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克 隆出多个和原型类似的新实例。
    工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子 类决定生产什么产品。
    抽象工厂(Abstract Factory)模式:提供一个创建产品族的接口,其每 个子类可以生产一系列相关的产品。
    建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分, 然后根据不同需要分别创建它们,最后构建成该复杂对象。

2、单例模式(Singleton)

(1)模式的定义与特点

  1. 定义:指一个类只有一个实例,且该类能自行创建这个实例的一 种模式。例如,Windows中的任务管理器、回收站等

  2. 特点:
    1)单例类只有一个实例对象;
    2)该单例对象必须由单例 类自行创建;
    3)单例类对外提供一个访问该单例的全局访问点。

(2)模式的结构与实现

普通类的构造函数是公有的, 外部类可以通过“new 构造函数 ()”来生成多个实例。
但是如果将类的构造函数设为私有的, 外部类就无法调用它生成多个实例了。
这时该类自身必须定义一 个静态私有实例,并向外提供一 个静态的公有函数用于创建或获取该静态私有实例。

1、结构

  • 单例类:包含一个实例且能自行创建这个实例的类。
  • 访问者类:使用单例的类

2、实现

  • 懒汉式单例:该模式的特点是类加载时没有生成单例,只有当第一次调用getInstance方法时才去创建这个单例

结构图:
在这里插入图片描述
代码如下:

 public class LazySingleton {
        private static volatile LazySingleton instance = null;//保证instance 在所有线程中同步

        private LazySingleton() {
        } //private避免类在外部被实例化

        public static synchronized LazySingleton getInstance() {//getInstance方法前加同步
            if (instance == null) {
                instance = new LazySingleton();
            }
            return instance;
        }
    }

例: 用懒汉式单例模式模拟产生美国当今总统对象。
在这里插入图片描述
代码:
测试类:


public class SingletonLazy {
	public static void main(String[] args) {
		President zt1 = President.getInstance();
        zt1.getName();// 输出总统的名字
        President zt2 = President.getInstance();
        zt2.getName();// 输出总统的名字
        if (zt1 == zt2) {
           System.out.println("他们是同一人!");
        }else {
           System.out.println("他们不是同一人!");
        } 
	}
}

President类:

class President{
	//保证instance在所有线程中同步
    private static volatile President instance=null;
    //private避免类在外部被实例化
    private President(){  System.out.println("产生一个总统!"); }
    //在getInstance方法上加同步
    public static synchronized President getInstance(){ 
        if(instance==null){
               instance=new President();
        }else {
           System.out.println("已经有一个总统,不能产生新总统!");
        } 
        return instance;
    }
    public void getName() {
        System.out.println("我是美国总统:特朗普。");
    }   
}

  • 饿汉式单例:该模式的特点是类一旦加载就创建一个单例,保证在调用getInstance方法之前单例已经存在了。

代码如下:

public class HungrySingleton {
	//类加载时候创建实例
    private static final HungrySingleton instance = newHungrySingleton();

    private HungrySingleton() {
    }
    
    public static HungrySingleton getInstance() {
        return instance;
    }
}

例:用饿汉式单 例模式模拟产生猪八戒对象。
结构图:
在这里插入图片描述
代码如下:
测试类:

public class SingletonEager {
    public static void main(String[] args) {
        JFrame jf = new JFrame("饿汉单例模式测试");
        jf.setLayout(new GridLayout(1, 2));
        Container contentPane = jf.getContentPane();
        
        Bajie obj1 = Bajie.getInstance();
        contentPane.add(obj1);
        
        Bajie obj2 = Bajie.getInstance();
        contentPane.add(obj2);
        if (obj1 == obj2) {
            System.out.println("他们是同一人!");
        } else {
            System.out.println("他们不是同一人!");
        }
        jf.pack();
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
}

Bajie 类:

class Bajie extends JPanel {
	//类加载时创建
    private static Bajie instance = new Bajie();

    private Bajie() {
        JLabel l1 = new JLabel(new ImageIcon("src/chapter02/singleton/Bajie.jpg"));
        this.add(l1);
    }

    public static Bajie getInstance() {
        return instance;
    }
}

(3)应用场景

  • 某类只要求生成一个对象的时候。如:一个班中的班长
  • 当对象需要被共享的场合。如:WEB中的配置对象、数据库连接池。
  • 当某类需要频繁实例化,而创建对的对象又频繁被销毁的时候。如:多线程的线程池、网络连接池。

(4)扩展

例模式可扩展为有限的多例(Multiton)模式,这种模式可生成有限个实例并保存在ArrayList中,客户需要时可随机获取,通俗的说就是,创建多个单例对象,存入list中,需要的时候去取。

在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:28:38  更:2022-04-26 11:29:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:25:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码