A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

王明

注册黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 王明 注册黑马   /  2011-8-5 15:15  /  3135 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

还记不记得张老师视频了讲的只创建一个类的实例对象的例子,怎么创建的,记得吗,别忘了告诉我。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 单例

查看全部评分

7 个回复

倒序浏览
黑马网友  发表于 2011-8-5 15:30:27
沙发
[code]class Chinese  {
        static Chinese objref=new Chinese();              //创建一个静态的Chinese 的实例对象
        public static Chinese getInstance(){                 // 返回一个Chinese类型的对象
        return objref;
        }[code][/code]}
class HeiMa
{
        public static void main(String [] args)
        {
                Chinese obj1=Chinese.getInstance();
                Chinese obj2=Chinese.getInstance();
                System.out.println(obj1==obj2);
}                                                                               //此时obj1和obj2所指的都是同一个实例对象
}
[/code]   

打印的结果是true

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-5 15:32:15
藤椅
失误了,[code]class HeiMa
{
        public static void main(String [] args)
        {
                Chinese obj1=Chinese.getInstance();
                Chinese obj2=Chinese.getInstance();
                System.out.println(obj1==obj2);
}                                                                               //此时obj1和obj2所指的都是同一个实例对象
}

class Chinese  {
        static Chinese objref=new Chinese();              //创建一个静态的Chinese 的实例对象
        public static Chinese getInstance(){                 // 返回一个Chinese类型的对象
        return objref;
        }
        }[/code]
回复 使用道具 举报
黑马网友  发表于 2011-8-5 16:01:21
板凳
补楼上,我觉得还应该有一个私有的构造方法,覆盖掉系统默认的无参数的构造方法,否则的话外界会通过那个统默认的构造方法来创建对象。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-5 16:41:59
报纸
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

单例模式的要点
  显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。

下面是的Person类运用的单例模式:[code=java]package heima.answer;

public class Person {
        public  String name = "xxx";//测试用的属性
       
        private Person(){   //把构造方式用private(私有的),在Person的外面就创建不了Person
               
                //do something
               
        }
       
        private static Person instance = null;
       
        public static Person getInstance(){ //该方法返回一个有Person内部自己创建的Person对象的一个引用,每调用该方法一次,Person类会重新创建一个Person对象,并返回一个新的地址给引用instance。
               
                if (instance == null) {
                       
                        instance = new Person();
                        System.out.println("instance正在创建。。。");
                }
               
                return instance;       
               
        }
               

       
       
       

}[/code]下面是测试类:[code=java]package heima.answer;

public class SingletonTest {

        public static void main(String[] args) {
               
               
                //Person person = new Person();  //报错,因为Person的构造方法设置为私有的了,外部无法创建。
               
                Person person2 = Person.getInstance();
                System.out.println(person2.name);
               
        }
}[/code][quote] Singleton(单例)模式是限制而不是改进类的创建。
   Singleton类中的实例构造器可以设置为Protected以允许子类派生。
   Singleton模式一般不要支持Icloneable接口,因为这可能导致多个对象实例,与Singleton模式的初衷违背。
   Singleton模式一般不要支持序列化,这也有可能导致多个对象实例,这也与Singleton模式的初衷违背。
  Singleton只考虑了对象创建的管理,没有考虑到销毁的管理,就支持垃圾回收的平台和对象的开销来讲,我们一般没必要对其销毁进行特殊的管理。
  理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的构造器的任意调用”。
  可以很简单的修改一个Singleton,使它有少数几个实例,这样做是允许的而且是有意义的。
  优点
  实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例
   灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程
  缺点
   开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题,上面的五种实现方式中已经说过了。
   可能的开发混淆:使用 singleton 对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用 new 关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
   对象的生存期:Singleton 不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于 .NET Framework 的语言),只有 Singleton 类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除
  对象实例,但这样会导致 Singleton 类中出现悬浮引用。
  适用性
  当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
  当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
  应用场景
  每台计算机可以有若干个打印机,但只能有一个Printer Spooler,避免两个打印作业同时输出到打印机。
  (摘自吕震宇的C#设计模式(7)-Singleton Pattern)
   PC机中可能有几个串口,但只能有一个COM1口的实例。
   系统中只能有一个窗口管理器。
  .NET Remoting中服务器激活对象中的Sigleton对象,确保所有的客户程序的请求都只有一个实例来处理。
  单例模式的实现要素:
  至少在目前所有了解的语言中,静态变量(这是c/c++的叫法,其他语言或有不同)是实现单例模式的要素。
[/quote]

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2

查看全部评分

回复 使用道具 举报

回复 楼主 的帖子

[code=java] import org.junit.Test;
public class Demo3 {
private static class SingletonHolder {
  static Demo3 instance = new Demo3();
}
public static Demo3 getInstance() {
  return SingletonHolder.instance;
}

@Test
public void test1() {
  
  Demo3 dm1 = Demo3.getInstance();
  Demo3 dm2 = Demo3.getInstance();
  System.out.println(dm1 == dm2);
}
}

[/code]

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-5 17:48:41
7#

回复楼主

你说的是JAVA中的设计模式之一—单例模式Singleton
Singleton 模式主要作用是保证在Java应用程序中,一个类Class 只有一个实例存在。
一般Singleton 模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private 的,它有一个static的private的该类变量,在类初始化时实例话,
通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class 的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance;
}
}
其他形式:定义一个类,它的构造函数为private的,所有方法为static的。一般认为第一种形式要更加安全些

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-5 18:21:36
8#
用枚举,我怀疑楼主是马甲>_<

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 你懂的

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马