zoukankan      html  css  js  c++  java
  • 设计模式-单例模式

    一、概念

    单例模式是创建型模式。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法,单例模式的要点有三个:
    1.类只有一个实例
    2.必须自行创建这个实例
    3.自行向整个系统提供这个实例

    二、角色

    只有一个单例角色,在单例类内部实现并且只生成一个实例,同时提供一个静态方法的getInstance()工厂方法获取实例;为了防止在外部对其实例化,将其构造函数设计为私有,这样就不可以在外面直接new了

    三、模板代码

    public class Singleton {
        private static Singleton instance=null;//不会立刻创建对象,省得没用到浪费
        private Singleton() {
        }
        //静态公有方法
        public static Singleton getInstance() {
            if(instance==null)//不能用于多线程,如果都通过if进入,就可能出现创建多个实例的问题
                instance=new Singleton();
            return instance;
        }
    }
    View Code
    public class Singleton {
        //最简单的写法,缺点在于实例在类初始化的时候就创建了,
        //如果在整个项目中都没有使用到该类,就会创建内存空间的浪费。
        private static Singleton instance=new Singleton();
        private Singleton() {
        }
        public static Singleton getInstance() {
            return instance;
        }
    }
    View Code

    四、应用

    身份证号码唯一,身份证卡重办也是唯一的身份证,此问题应用可以使用单例模式。

    public class IdCard {
    
        private static IdCard instane=null;
        private String no;//号码
        private IdCard() {
        }
        public static IdCard getInstance() {
            if(instane==null)
            {
                System.out.println("首次办理身份证,分配新号码");
                instane=new IdCard();
                instane.setNo("100865201314");
            }
            else 
                System.out.println("重复办理身份证,获取旧号码");
            return instane;
        }
        
        private void setNo(String no) {
            this.no=no;
        }
        public String getNo() {
            return this.no;
        }
    }
    public class Client {
        public static void main(String[] args) {
            IdCard x1,x2;
            x1=IdCard.getInstance();
            x2=IdCard.getInstance();
            //IdCard x3=new IdCard();//报错,不可以在外部构造
            System.out.println("对象是否相同 x1==x2  "+(x1==x2));//x1和x2也是同一个类
            String s1,s2;
            s1=x1.getNo();
            s2=x2.getNo();
            String s3=new String("100865201314");
            System.out.println("内容是否相同 s1==s2  "+s1.equalsIgnoreCase(s2));
            System.out.println("内容是否相同 s1==s3  "+s1.equalsIgnoreCase(s3));
            System.out.println("对象是否相同 s1==s2  "+(s1==s2));//true 显然s1和s2指向的是同一片堆内存
            System.out.println("对象是否相同 s1==s3  "+(s1==s3));//false 
        }
    }

    输出:

    首次办理身份证,分配新号码
    重复办理身份证,获取旧号码
    对象是否相同 x1==x2 true
    内容是否相同 s1==s2 true
    内容是否相同 s1==s3 true
    对象是否相同 s1==s2 true
    对象是否相同 s1==s3 false

  • 相关阅读:
    mysql5.7创建用户授权删除用户撤销授权
    什么是分表和分区 MySql数据库分区和分表方法
    linux命令大全之watch命令详解(监测命令运行结果)
    netstat统计的tcp连接数与⁄proc⁄pid⁄fd下socket类型fd数量不一致的分析
    ss is one another utility to investigate sockets(特适合大规模tcp链接)
    /proc/net/sockstat 里的信息是什么意思?
    linux平台下server运维问题分析与定位
    strace命令解析
    MySQL常见错误代码及代码说明
    自动化部署必备技能—定制化RPM包
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/11750042.html
Copyright © 2011-2022 走看看