黑马程序员技术交流社区

标题: 怎样实现单例设计? [打印本页]

作者: 吴通    时间: 2012-8-24 21:38
标题: 怎样实现单例设计?
class Res
{
private String name;  //私有
private String sex;
private boolean flag=false;
//对外提供访问方式
public synchronized void set(String name,String sex)    //同步
{
  if(flag)         //唤醒
   try{this.wait();}catch(Exception e){}
  this.name=name;
  this.sex=sex;
  flag=true;
  this.notify();
}
public synchronized void out()                   //同步
{
  if(!flag)
   try{this.wait();}catch(Exception e){}
  System.out.println(name+"...."+sex);
  flag=false;
  this.notify();
}
}
class Input implements Runnable
{
private Res r;
Input(Res r)
{
  this.r=r;
}
public void run()
{
  while(true)
  {
    int x=0;
    if(x==0)
     r.set=("mike","man");
    else
     r.set=("丽丽","女女女女女");
    x=(x+1)%2;
  }
}
}
class Output implements Runnable
{
private Res r;
Output(Res r)
{
  this.r=r;
}
public void run()
{
  while(true)
  {
    r.out();
  }
}
}
class InOutput
{
public static void main(String[] args)
{
  Res r=new Res();
  new Thread(new Input(r)).start();
  new Thread(new Output(r)).start();
}
}

这个问题怎样用单例设计来解决呢?

作者: 黑马_许芸    时间: 2012-8-24 21:50
单例模式应该就那几个步骤吧:
1:构造函数设为private 。
2:在这个类里设置一个自身的成员变量  private Res res = new Res();
3:为这个成员变量 res 提供 get 方法。
作者: 寇龙飞    时间: 2012-8-24 23:30
本帖最后由 寇龙飞 于 2012-8-24 23:41 编辑

哥们你的代码实在是让我胃疼!!!!
贴上来那么一大段,格式混乱,各种空格(以后用Tab键把),中间还有英文全角格式的括号,原谅我的自我强迫症把,我修改你的代码格式化了五分钟,最后整理好一看,天呐函数调用方法写成这r.set=("","man");,我差点吐血,这不是毕老师视频讲的代码嘛,照着抄过来,是这。。。请原谅我的直接。

我找来我以前学习时的代码贴给你吧(代码是等待唤醒机制那块的):
  1. package com.itheima.bixiangdong;
  2. /* 黑马程序员_毕向东_Java基础视频教程第12天-03-多线程(线程间通信-等待唤醒机制)
  3. * 对同一个对象,同时进行向内存入和向外打印
  4. * */


  5. class Resource {
  6.         
  7.         private String name;
  8.         private String sex;
  9.         private boolean flag = false;
  10.         
  11.         synchronized void set(String name, String sex) {
  12.                 if(flag)
  13.                         try {
  14.                                 this.wait();
  15.                                 }
  16.                         catch(InterruptedException e) {
  17.                                 e.printStackTrace();
  18.                                 }
  19.                 this.name = name;
  20.                 this.sex = sex;
  21.                 flag = true;
  22.                 this.notify();
  23.         }
  24.         
  25.         synchronized void show() {
  26.                         if(!flag)
  27.                                 try {
  28.                                         this.wait();
  29.                                         }
  30.                                 catch (InterruptedException e) {
  31.                                         e.printStackTrace();
  32.                                         }
  33.                         System.out.println(name +" is "+ sex);
  34.                         flag = false;
  35.                         this.notify();
  36.         }
  37. }

  38. class Input implements Runnable {
  39.         
  40.         private Resource r;
  41.         
  42.         Input(Resource r) {
  43.                 this.r = r;
  44.         }
  45.         public void run() {
  46.                 int i = 0;
  47.                 while(true) {
  48.                         if(0 == i)
  49.                                 r.set("Jack", "man");
  50.                         else
  51.                                 r.set("Rose", "woman");
  52.                         i = ++i % 2;
  53.                 }
  54.         }
  55. }

  56. class Output implements Runnable {
  57.         
  58.         private Resource r;
  59.         
  60.         Output(Resource r) {
  61.                 this.r = r;
  62.         }
  63.         public void run() {
  64.                 while(true) {
  65.                         r.show();
  66.                 }
  67.         }
  68. }

  69. public class InputOutput {
  70.         
  71.         public static void main(String[] args) {
  72.                
  73.                 Resource r = new Resource();
  74.                
  75.                 new Thread(new Input(r)).start();
  76.                 new Thread(new Output(r)).start();
  77.         }
  78. }
复制代码
程序是死循环,运行结果为:
  1. Jack is man
  2. Rose is woman
  3. Jack is man
  4. Rose is woman
  5. Jack is man
  6. Rose is woman
  7. Jack is man
  8. Rose is woman
  9. Jack is man
  10. Rose is woman
  11. Jack is man
  12. Rose is woman
  13. Jack is man
  14. Rose is woman
  15. Jack is man
  16. Rose is woman
  17. Jack is man
  18. Rose is woman
  19. Jack is man
  20. Rose is woman
  21. Jack is man
  22. Rose is woman
  23. Jack is man
  24. Rose is woman
  25. .......
复制代码

作者: 黑马_许芸    时间: 2012-8-25 07:10
黑马_许芸 发表于 2012-8-24 21:50
单例模式应该就那几个步骤吧:
1:构造函数设为private 。
2:在这个类里设置一个自身的成员变量  private  ...

额,你说的对,我忘了。
作者: 陈红建    时间: 2012-8-25 11:03
我给你一个简单的静态工厂也可以叫单例的例子
class Car
{
        private Car car = new Car();//私有化返回对象
        private Car(){}//私有化构造函数避免创建对象
        //创建一个获取对象的方法
        public static Car newInstance()
                {
                        return car;
                }
}
//这样你就可以直接调用这个静态方法来得到Car的对象
//无论你用了几次这个静态方法最终获得的都是car这个对象
//下面是测试程序
class Test
{
        public static void main(String[] args)
        {
                Car car = Car.newInstance();//获得Car对象
                Car car1 = Car.newInstance();//获得Car对象
                System.out.println(car==car1);//结果为true
                //因为car和car1是同一个对象
                //这就是单利设计模式 从头到脚只能创建一个Car对象
                //设计模式是一个灵活运用的东西,但是不要在乎那些条条框框
                //这只是一种设计程序的方法和思路
        }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2