单利模式详解编程语言

1.创建一个Student类 
 
 public  class Student {   //学生的实体类 
     
    private  String  name; //姓名 
    private  int  age;    //年龄 
     
    public Student() {  
 
        super(); 
 
  }  
 
   public Student(String name, int age) { 
 
        super(); 
 
        this.name = name;  
 
        this.age = age;  
 
 }  
 
   public String getName() {          
 
        return name; 
 
  }  
 
   public void setName(String name) {  
 
     this.name = name;  
 
 }  
 
    public int getAge() {  
 
     return age; 
 
  }  
 
   public void setAge(int age) {  
 
       this.age = age; 
 
  } 
 
 }  
 
    
2.创建测试类 
 public class SingletonTest { 
 
    public static void main(String[] args) { 
        //创建第一个学生对象 
        Student stu1=new Student("学生1", 21); 
        //创建第二个学生对象 
        Student stu2=new Student("学生2", 22); 
         
        //输出对应学生的信息 
        System.out.println("学生1的姓名:"+stu1.getName()); 
        System.out.println("学生2的姓名:"+stu2.getName()); 
         
        System.out.println("***************************"); 
    } 
} 
 
3.运行查看结果 
 /* 
          * 在项目中  只想让Student这个类 实例化一次!也就是整个程序中只有一个对象! 
          * 操作的所有Student对象 都是一个! 
          *  
          * 单例模式: 保证整个系统中一个类 只有一个实例!而且这个实例只能是自身创建! 
          * 外部不能直接创建对象! 不能new !  只能通过类中的固定方法获取! 
          *  
          * 01.懒汉式 
          * 02.饿汉式 
          * 03.双重锁 
          *  
          */ 
 
4.创建SingletonStudent实体类 
 public  class SingletonStudent {    
 
   //懒汉式 
 
  //01.创建了一个类型是本类对象的静态属性 
      private  static SingletonStudent student=null;  
 
      private String name;  
 
      private  int age;  
 
  //02.构造私有化 
    private SingletonStudent() {  
 
  }  
 
  //03.提供外部访问的接口 返回当前类的对象 
    public static synchronized SingletonStudent getInsance(){ 
 
       if (student==null) {  
 
           student=new SingletonStudent(); 
 
      }  
 
        return student;  
 
 }  
 
  public String getName() { 
 
 
      return name; 
 
  }  
 
  public void setName(String name) {  
 
    this.name = name; 
 
  }  
 
  public int getAge() { 
 
    return age;  
 
 } 
 
  public void setAge(int age) {  
 
    this.age = age;  
 
 } 
 
 }  
    
 
5.在测试类中增加代码 
   //通过SingletonStudent类中提供的方法来构造实例 
        SingletonStudent student1=SingletonStudent.getInstance(); 
 
   //给第一个学生的年龄和姓名赋 
        student1.setAge(50); 
 
        student1.setName("小黑"); 
 
        SingletonStudent student2=SingletonStudent.getInstance();  
 
   //给第二个学生的年龄赋值 
        student2.setAge(55);  
 
       System.out.println(student1.getAge()); 
 
       System.out.println(student2.getName());  
 
       System.out.println(student1==student2);  //true  
 
    
 6.运行查看结果后发现 student1和student2其实就是一个对象!实现了单例 
 
 7.饿汉式实现单例  创建实体类SingletonStudent2 
 
 
 
 
  public  class SingletonStudent2 {    
 
 //饿汉式  
 
  //01.创建一个自己的实例 仅供自身访问 
    private  static SingletonStudent2 student=new SingletonStudent2(); 
 
    private String name; private  int age;  
 
   //02.构造私有化 
    private SingletonStudent2() { 
 
  }  
 
  //03.提供外部访问的接口 返回当前类的对象 
    public static synchronized SingletonStudent2 getInstance(){  
 
         return student; 
 
  } 
 
  public String getName() { 
 
        return name;  
 
 }  
 
  public void setName(String name) {  
 
       this.name = name;  
 
 }  
 
  public int getAge() { 
 
       return age; 
 
  } 
 
  public void setAge(int age) { 
 
       this.age = age; 
 
  } 
 
 }  
 
    
8.在测试类中增加测试代码 运行查看效果  还是单例 
 
 @Test// 02.饿汉式 
    public  void test02(){  
 
    //通过SingletonStudent2类中提供的方法来构造实例 
        SingletonStudent2 student1=SingletonStudent2.getInstance();  
 
    //给第一个学生的年龄和姓名赋值 
        student1.setAge(50);  
 
        student1.setName("小黑");  
 
       SingletonStudent2 student2=SingletonStudent2.getInstance(); 
 
    //给第二个学生的年龄赋值 
          student2.setAge(55);  
 
          System.out.println(student1.getAge());  
 
         System.out.println(student2.getName()); 
 
          System.out.println(student1==student2); //true 
    }  
 
    
9.双重锁的机制实现单例 创建实体类 
 
 public  class SingletonStudent3 {   
 
 //双重锁 //01.创建了一个类型是本类对象的静态属性 
    private  static SingletonStudent3 student=null; private String name;  
 
    private  int age;  
 
  //02.构造私有化 
    private SingletonStudent3() { 
 
  }  
 
  //03.提供外部访问的接口 返回当前类的对象 
    public static synchronized SingletonStudent3 getInstance(){ 
 
       if (student==null) {  
 
            synchronized (SingletonStudent3.class) {  //再次加锁 
                if (student==null) {  
 
                    student=new SingletonStudent3(); 
 
        }  
 
      } 
 
  }  
 
       return student;  
 
 } 
 
   public String getName() { 
 
        return name; 
 
  }  
 
   public void setName(String name) {  
 
      this.name = name;  
 
 }  
 
   public int getAge() { 
 
       return age; 
 
  }  
 
  public void setAge(int age) {  
 
        this.age = age; 
 
  } 
 
 }  
 
    
10.在测试类中增加测试代码 运行查看效果  还是单例 
 
 @Test//03.双重锁 
    public  void   test03(){ 
        //通过SingletonStudent2类中提供的方法来构造实例 
        SingletonStudent3 student1=SingletonStudent3.getInstance(); 
        //给第一个学生的年龄和姓名赋值 
        student1.setAge(50); 
        student1.setName("小黑");   
         
        SingletonStudent3 student2=SingletonStudent3.getInstance(); 
        //给第二个学生的年龄赋值 
        student2.setAge(55); 
         
        System.out.println(student1.getAge()); 
        System.out.println(student2.getName()); 
        System.out.println(student1==student2); //true 
    } 
  

  

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/12187.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论