I want to fly higher
programming Explorer
posts - 114,comments - 263,trackbacks - 0
    所谓设计模式,是很多软件开发人员在软件开发过程中总结出来的优秀设计方法。掌握这些方法并可以应用到其他的软件开发中,从而提高效率,便于维护,开发出更优秀的软件。 
    其中设计模式的经典著作为《设计模式》,由传说中的GoF四人组合作编写。该书总结了历史上软件开发的经验,给出了描述模式的一些特征,并提炼出用于指导软件设计的23种模式和一些面向对象的设计方法。

    这些模式大体上分为三类,分别从对象的创建,对象的结构以及对象的行为这三个行为来总结软件开发人员在设计方面的经验。

1创建型模式(针对对象的创建):常用的包括简单工厂模式,工厂方法模式,抽象工厂模式,单例模式等。

2结构型模式(针对对象的组成以及对象之间的依赖关系):常用的包括享元模式等。

3行为型模式(针对对象的行为):常用的包括观察者模式等。

下面针对常用的设计模式编写程序,具体讲解(Java版本),本篇随笔主要是单例模式

所谓单例模式,就是确保一个类只有一个实例,并且该实例必须自动创建,并向整个系统提供该实例。

而单例模式又可以分为饿汉式单例模式懒汉式单例模式。饿汉式是在类初始化时就已经创建了自身对象,而懒汉式单例模式则是在需要使用的时候才创建自身的对象,他们的示意代码如下:

饿汉式单例模式:
    

 1public class Singleton
 2
 3{
 4
 5       private static Singletion instance = new Singleton();
 6
 7       public static Singleton getInstance()
 8
 9{return instance;}
10
11}

12
13

懒汉式单例模式:
    

 1public class Singleton
 2
 3{
 4
 5       private static Singleton instance = null;
 6
 7       public static Synchronized Singleton getInstance()
 8
 9{
10
11       if(instance == null)
12
13{instance = new Singleton();}
14
15return instance;
16
17}
 
18
19}

20
21


注意上面的懒汉式单例模式的getInstance方法加了Synchronized关键字,这是为了在多线程环境下依然保证单例。

    下面写了一个程序实现单例模式线程,定时向控制台输出信息:其中包括一个类Farmer.java(农民),继承Person,该类采用单例模式创建对象。还包括一个类SingletonThread.java,实现Runnable接口。最后包括一个测试类SingletonThreadTest.java,创建了两个线程,并启动。具体的代码见下面:


Person.java:

 1package com.landon.trainjava.oop;
 2/**
 3 * 一个普通的抽象类,人
 4 * @author landon
 5 *
 6 */

 7public abstract class Person {
 8 /**
 9  * 为了享元模式中的方便一些,没有加入private修饰符
10  * 另外为了另一个包下的使用,用protectd修饰
11  */

12  protected String personName;
13  protected int personAge;
14 
15 //右键Source->Generate Getters and Setters
16 public String getPersonName() {
17  return personName;
18 }

19
20 public void setPersonName(String personName) {
21  this.personName = personName;
22 }

23
24 public int getPersonAge() {
25  return personAge;
26 }

27
28 public void setPersonAge(int personAge) {
29  this.personAge = personAge;
30 }

31
32 /**
33  * 抽象方法
34  */

35 public abstract void sayHello();
36
37}

38
39


Farmer.java:

 1package com.landon.trainjava.designpattern;
 2
 3import com.landon.trainjava.oop.Person;
 4
 5/**
 6 * 单例模式的运用
 7 * @author landon
 8 *
 9 */

10class Farmer extends Person{
11 /**
12  * 静态的Farmer实例
13  */

14 private static Farmer instance = null;
15 /**
16  * 注意修饰符是private
17  */

18 private Farmer()
19 {
20  
21 }

22 
23 /**
24  * 为了保证多线程环境下的单例模式,要加上Syncronized关键字
25  * @return Farmer实例
26  */

27 public static synchronized Farmer getFarmerInstance()
28 {
29  if(instance == null)
30  {
31   instance = new Farmer();
32  }

33  
34  return instance;
35 }

36 public void sayHello()
37 {
38  System.out.println("Hello,I'm a farmer!");
39 }

40}

41
42


SigletonThread.java:

 

 1package com.landon.trainjava.designpattern;
 2/**
 3 * 实现runnable接口,覆写run方法
 4 * @author landon
 5 *
 6 */

 7class SigletonThread implements Runnable{
 8 public void run()
 9 {
10  //获取farmer实例
11  Farmer farmer = Farmer.getFarmerInstance();
12  while(true)
13  {
14   farmer.sayHello();
15   
16   try 
17   {
18    Thread.sleep(1000);
19   }

20   catch (InterruptedException exception) {
21    exception.printStackTrace();
22   }

23  }

24  
25 }

26
27}

28
29


SigletonThreadTest.java:

 1package com.landon.trainjava.designpattern;
 2/**
 3 * 单例模式多线程
 4 * @author landon
 5 *
 6 */

 7public class SigletonThreadTest {
 8 public static void main(String []args)
 9 {
10  Thread thread1 = new Thread(new SigletonThread());
11  Thread thread2 = new Thread(new SigletonThread());
12  
13  thread1.start();
14  thread2.start();
15 }

16
17}

18
19


    ps:单例模式的好处有很多方面,其主要作用是保证在Java应用程序中,一个类Class只有一个实例存在,如在数据库连接时需要单线程操作。再比如网站中的计数器的实现(Synchronized)。另外单例模式限制了实例的个数,有利于Java垃圾回收,节省了内存。

posted on 2010-07-07 20:22 landon 阅读(2230) 评论(0)  编辑  收藏 所属分类: Program