面向对象——单例设计模试

2019-04-14 16:22发布

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

5.面向对象--单例设计模式

设计模式概念:对问题行之有效的解决方法,是一种思想,对面向对象的语言都是通用的。 Java23种设计模式,单例设计模式是其中一种。 单例设计模式解决的问题:保证一个类在内存中对象的唯一性。 什么时候使用单例设计模式? Java中多个引用变量,操作同一个对象以及在实际应用中多个应用程序,操作一个类,就需要使用单例设计模式。 实现单例设计模式的步骤: 1, 构造函数私有化。 2, 使用new创建本类对象,并加上static修饰符。 3, 对外提供公共访问方法,将对象返回。 单例的内存图解: 如: class Person { /* 实现单例的三步骤: */ private Person(){}//构造函数私有化 private static final Person p=new Person();//使用new创建本类对象。 public static Person getInstance(){//对外提供公共方法,把对象返回。 return p; } int age; String name; public void show(){ System.out.println(name+":"+age); } } class Demo { public static void main(String[]args){ Person p1=Person.getInstance(); Person p2=Person.getInstance(); p1.age=20; p2.name="张三"; System.out.println(p1==p2);//结果为true } }   以上代码,p1p2变量,指向堆内存中的同一个实体。  如图:        单例模式分为:懒汉式、饿汉式 懒汉式:类加载时没有对象,调用对外提供的公共方法getInstance(),才创建对象,延迟加载。 class Person { private Person(){} private static Person p=null;//类加载时,没有创建对象。 public static Person getInstance(){//方法中使用if判断,如果p的引用等于null,就创建对象,否则,返回引用变量p。 if(p==null) p=new Person(); return p; }
  /* 多线程时,懒汉式安全问题的解决: public static Person getInstance(){ if(p==null){ synchronized(Person.class){ if(p==null){ p=new Person(); } } } return p; } */   } class SingleDemo { public static void main(String[]args){ Person p1=Person.getInstance(); Person p2=Person.getInstance(); System.out.println(p1==p2);//结果为true } }   饿汉式:类一加载,就创建对象。 class Person { private Person(){} private static final Person p=new Person();//类一加载就创建对象, public static Person getInstance(){//调用方法,返回引用变量p,可见,返回的引用变量指向了同一个对象。 return p; } } class SingleDemo { public static void main(String[]args){ Person p1=Person.getInstance(); Person p2=Person.getInstance(); System.out.println(p1==p2);//结果为true。 } }   总结:单例设计模式,解决了一个类在内存中对象的唯一性,如果一个类需要保证其对象的唯一性,则只需要在类中加入单例设计模式的三个步骤的代码,就可以。 ---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------