java 23 - 2 设计模式之单例模式

单例模式:保证类在内存中只有一个对象。

如何保证类在内存中只有一个对象呢?
   A:把构造方法私有
   B:在成员位置自己创建一个对象
   C:通过一个公共的方法提供访问

单例模式之饿汉式:  (一进来就造对象,一回家就吃饭,饿。。)

 1 public class Student {
 2     // A:把构造方法私有
 3     private Student() {
 4     }
 5   
 6     // 在成员位置自己创建一个对象
 7     // 静态方法只能访问静态成员变量,加静态
 8     // 为了不让外界直接访问修改这个值,加private
 9     private static Student s = new Student();
10
11     // C:通过一个公共的方法提供访问
12     // 为了保证外界能够直接使用该方法,加静态
13     public static Student getStudent() {
14         return s;
15     }
16 }

测试类:

 1 public class StudentDemo {
 2     public static void main(String[] args) {
 3         //按照平常来创建2个对象试试
 4         // Student s1 = new Student();
 5         // Student s2 = new Student();
 6         // System.out.println(s1 == s2); // false,地址值不一样,证明是2个不同的对象
 7
 8
 9         //下面是直接更改了对象s的值,要避免这样的情况,所以在Student类中给对象加私有private
10         //Student.s = null;
11
12         // 通过单例如何得到对象呢?
13         Student s1 = Student.getStudent();
14         Student s2 = Student.getStudent();
15         System.out.println(s1 == s2);
16
17         System.out.println(s1); // null,[email protected]
18         System.out.println(s2);// null,[email protected]
19     }
20 }

单例模式之懒汉式:(用的时候才创建对象,不饿不吃)

 1 public class Teacher {
 2     private Teacher() {
 3     }
 4     //先不创建对象,就是没new
 5     private static Teacher t = null;
 6
 7     public synchronized static Teacher getTeacher() {
 8         // 为了防止出现线程安全问题,这里使用同步机制:synchronized
 9         //使用的时候,进行判断
10         if (t == null) {
11             //如果是第一次使用,就创建对象
12             t = new Teacher();
13         }
14         //不是第一次,就返回之前创建的对象
15         return t;
16     }
17 }

测试类:

1 public class TeacherDemo {
2     public static void main(String[] args) {
3         Teacher t1 = Teacher.getTeacher();//t1进去Teacher中是null,创建对象
4         Teacher t2 = Teacher.getTeacher();//t2进去不是null,用的t1创建的对象
5         System.out.println(t1 == t2);
6         System.out.println(t1); // [email protected]
7         System.out.println(t2);// [email protected]
8     }
9 }

单例模式:
   饿汉式:类一加载就创建对象
   懒汉式:用的时候,才去创建对象

面试题:单例模式的思想是什么?请写一个代码体现。
   开发:饿汉式(是不会出问题的单例模式)
   面试:懒汉式(可能会出问题的单例模式)
       A:懒加载(延迟加载)
         B:线程安全问题
          a:是否多线程环境 多线程环境下是
          b:是否有共享数据 是,对象t就被共享了
          c:是否有多条语句操作共享数据 是,t1、t2就在共同操作t

还有看这个文章,转载:

JAVA设计模式之单例模式

时间: 2024-11-13 09:18:40

java 23 - 2 设计模式之单例模式的相关文章

java 23 种设计模式

一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 其实还有两类:并发型模式和线程池模式.用一个图片来整体描述一下: 二.设计模式的六大原则 1.开闭原则(Open Clo

重头开始学23种设计模式:单例模式

最近感觉做程序又开始浑浑噩噩,对设计模式和算法基本了解,但基本不会用.所以打算最近1个月把设计模式和算法重新,温故而知新下. 首先从程序开发经常涉及到的23种设计模式开始,希望这次能更加熟练的运用设计模式来加强自己的开发能力. 首先从单例模式开始: 单例模式在我的理解是对程序对象的缓存,防止不断new,保持对象唯一性,提高程序性能. namespace SinglePattern { class Program { static void Main(string[] args) { for (i

(转)java 23种设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

23种设计模式(一) 单例模式

单例模式 定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式是23种设计模式中最简单的一种,它有三个要素: 私有的构造方法 指向自己实例的私有静态引用 以自己实例为返回值的静态的公有的方法 单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例.饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用:而懒汉式在调用取得实例方法的时候才会实例化对象. 饿汉式单例 public class Singleton { private static

java 23种设计模式学习。

一.3大类设计模式:创建型,结构型,行为型. a.5种创建型模式:工厂方法,抽象工厂,单例,建造者,原型. b.7种结构型模式:适配器,装饰器,代理,外观,桥接,组合,享元. c.11种行为型模式:策略,模板方法,观察者,迭代子,责任链,命令,备忘录, 状态,访问者,中介者,解释器. 注意:除上述3大类外,还有另2类设计模式:并发型,线程池. 二.设计模式6大原则:开闭,里氏代换,依赖倒转,接口隔离,迪米特(最少知道),合成复用. a.开闭:对拓展开发,对修改关闭.程序进行拓展时,不能修改原有的

java基础之----23种设计模式(单例模式)

概述 提到单例模式,我们并不陌生,而且面试中也常常会问单例模式相关的问题,接下来就谈谈单例模式,这篇文章会回答如下几个问题: 什么是单例模式? 单例模式有几种实现方式,以及各种实现方式的优劣? 单例模式有什么用? 什么是单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点.这是<设计模式>(艾迪生维斯理, 1994)中的定义. 单例模式有几种实现方式 先说答案,有三种,基本上我们只知道两种,就是懒汉式和饿汉式,其实还有第三种,通过静态内部类实现单例模式,下面就说说这三种实现方式. 饿

Java进阶篇设计模式之一 ----- 单例模式

前言 在刚学编程没多久就听说过设计模式的大名,不过由于当时还是个彻彻底底的菜鸟,并没有去触碰.直到在开始工作中对简单的业务代码较为熟悉之后,才正式的接触设计模式.当时最早接触的设计模式是工厂模式,不过本文讲的是单例模式,这里就留着下篇文章中在讲解.至于为什么先讲解单例模式? 那是因为单例模式是设计模式中最简单的... .凡事总有个先后顺序,所以就先易后难了.好了,废话不多说了,开始进入正片. 设计模式简介 说明:这里说了的简介就是真的 "简介". 什么是设计模式 设计模式是一套被反复使

关于Java 23种设计模式的有趣见解

原文出自:http://developer.51cto.com/art/201205/338617.htm 在网络上流畅很广的一篇旧文,暂时没找到原作者,目前所看到的最早转载时间是 2005 年 2 月 28 日.作者用 轻松的语言,形象解释了 23 种模式,有很好的启发作用. 创建型模式 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不 同,但不管你带MM去麦当劳或肯德基,只管向服务员说"来四个鸡翅"就行了.麦当劳和肯德基就是生产

JAVA 23种设计模式(转)

1.FACTORY?追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了.麦当劳和肯德基就是生产鸡翅的Factory 工厂模式:客户类和工厂类分开.消费者任何时候需要某种产品,只需向工厂请求即可.消费者无须修改就可以接纳新产品.缺点是当产品修改时,工厂类也要做相应的修改.如:如何创建及如何向客户端提供. 2.BUILDER?MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言