疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java的23种设计模式之单例模式


 

学习到java一共有23种设计模式,设计模式是被大多数人知晓,反复使用,约定俗成的代码经验总结。每种设计模式都代表了在项目中会重复发生的问题,所以合理的运用设计模式可以完美的解决很多问题。
 
学习java的设计模式是很有必要的。虽然在面向对象还没学习到继承和接口,但是23中设计模式中的单例模式已经可以了解了。
 
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。具体有两种表现形式:
 
复制代码
package 面向对象;
//单例设计模式第一种
public class Singleton 
{
    public static void main(String[] args)
    {
    SingletonDemo a=SingletonDemo.getInstance();
    }
}
class SingletonDemo
{
    private static SingletonDemo a =null;
    private SingletonDemo(){}
    public static SingletonDemo getInstance()
    {
        if(a==null)
        {
            SingletonDemo a=new SingletonDemo();
        }
        return a;
    }
}
复制代码
这种方式可以看出在调用方法时才创建新的对象,但是在多线程时容易产生问题,所以一般开发用的是下面的一种方式。
 
复制代码
 1 package 面向对象;
 2 
 3 public class Singleton_2 
 4 {
 5     public static void main(String[] args)
 6     {
 7         Singleton_2Demo a=Singleton_2Demo.getInstance();
 8     }
 9 }
10 
11 class Singleton_2Demo
12 {
13     private Singleton_2Demo(){}
14     private static Singleton_2Demo a=new Singleton_2Demo();
15     public static Singleton_2Demo getInstance()
16     {
17         return a;
18     }
19 }
复制代码
这种方式简单,不用考虑多线程的问题
 
通过这个设计模式对之前学习时写的面向对象的练习调整了一下,实现了单例的模式。
原代码:
 
复制代码
package 面向对象;
 
 class Student 
{
    
        private String name;
        private int number;
        private String sex;
        private boolean learn;
        private String a;
    Student()
     {
         name="未知";
         number=000;
         sex="未知";
         learn=false;
         a="未知";
     }
     public void setName(String name)
     {
         this.name=name;
     }
     public void setNumber(int number)
     {
         this.number=number;
     }
     public void setSex(String sex)
     {
         this.sex=sex;
     }
     public void setLearn(boolean learn)
     {
         this.learn=learn;
     }
     void scan()
    {
        if(this.learn==true)
        {
            a="在学习";    
        }
        else
        {
            a="不在学习";
        }    
         System.out.print("姓名:"+this.name+" 学号:"+this.number+" 性别;"+this.sex+" 是否在学习:"+a);
    }
    
}
 class Data
 {
     public static void main(String[] arg)
     {
         Student XiaoMin=new Student();
         XiaoMin.setName("小明");
         XiaoMin.setNumber(13023);
         XiaoMin.setSex("男");
         XiaoMin.setLearn(true);
         XiaoMin.scan();
     }
 }
复制代码
单例模式:
 
复制代码
package 面向对象;
//实现单例设计模式
 class Student_1 
{
    
        private String name;
        private int number;
        private String sex;
        private boolean learn;
        private String a;
     private Student_1()
     {
         name="未知";
         number=000;
         sex="未知";
         learn=false;
         a="未知";
     }
     private static Student_1 b=new Student_1();
     public static Student_1 getInstance()
     {
         return b;
     }
     public void setName(String name)
     {
         this.name=name;
     }
     public void setNumber(int number)
     {
         this.number=number;
     }
     public void setSex(String sex)
     {
         this.sex=sex;
     }
     public void setLearn(boolean learn)
     {
         this.learn=learn;
     }
     void scan()
    {
        if(this.learn==true)
        {
            a="在学习";    
        }
        else
        {
            a="不在学习";
        }    
         System.out.print("姓名:"+this.name+" 学号:"+this.number+" 性别;"+this.sex+" 是否在学习:"+a);
    }
    
}
 class Data_2
 {
     public static void main(String[] arg)
     {
         Student_1 XiaoMin=Student_1.getInstance();
         XiaoMin.setName("小王");
         XiaoMin.setNumber(13023);
         XiaoMin.setSex("男");
         XiaoMin.setLearn(true);
         XiaoMin.scan();
     }
 }
复制代码