>  기사  >  php教程  >  php单例模式

php单例模式

PHP中文网
PHP中文网원래의
2016-05-23 17:10:10996검색

1. [代码]单例    

package com.factory;
/*
 * 第一种方式创建单例
 */
class OneSingleton{
	private static int number =0;		//私有属性
	private static OneSingleton instance = new OneSingleton();	//OneSingleton的唯一实例
	private OneSingleton(){}
	public static OneSingleton getInstance(){
		return instance;
	}
	public synchronized int getNumber(){	//synchronized关键字表示方法是线程同步
		return number;						//任一时刻最多只能有一个线程进入该方法
	}
	public synchronized int nextNumber(){
		return number++;
	}
}
/*
 * 第二种创建单例方法
 */
class TwoSingleton{
	private static int number =0;
	private static TwoSingleton instance = null;
	private TwoSingleton(){}
	public static synchronized TwoSingleton getInstance(){
		if(instance == null){
			instance = new TwoSingleton();
		}
		return instance;
	}
	public synchronized int getNumber(){
		return number;
	}
	public synchronized int nextNumber(){
		return number++;
	}
}
/**
 * @function 单例模式
 * @author JarCode
 * 技术要点:
 * 单例模式有两种实现方式:
 * >>一种是将类的 构造方法私有化,用一个私有的类变量instance保存类的实例,
 *在加载类时,创建类的实例,改方法直接返回instance.
 * >>另一种是将类的 构造方法私有化,用一个私有的类变量instance保存类的实例,
 *在加载类时,将null赋给instance,再提供一个公有的静态方法getInstance
 * ,用于获取类的唯一实例,该方法首先判断instance是否为null,
 *如果为null,则创建实例对象,否则返回instance。
 * 
 * 两种方式的区别:
 * >>前者被加载时,类的唯一实例被创建,后者在第一次调用getInstance()方法时,类的唯一实例被创建,但需要在getInstance()方法中使用synchronized
 * 关键字,保证某一时刻只有一个线程调用此方法。
 *
 */
public class TestSingleton {
	public static void main(String[] args) {
		OneSingleton one1 = OneSingleton.getInstance();
		OneSingleton one2 = OneSingleton.getInstance();
		System.out.println("用onsingleton实现单例模式");
		System.out.println("调用nextnumber()方法之前:");
		System.out.println("one1.number="+one1.getNumber());
		System.out.println("one2.number="+one2.getNumber());
		one1.nextNumber();
		System.out.println("调用nextnumber()方法后:");
		System.out.println("one1.number"+one1.getNumber());
		System.out.println("one2.number"+one2.getNumber());
		
		
		TwoSingleton two1 = TwoSingleton.getInstance();
		TwoSingleton two2 = TwoSingleton.getInstance();
		System.out.println("用twosingleton实现单例模式");
		System.out.println("抵用nextnumber方法之前:");
		System.out.println("two1.number="+two1.getNumber());
		System.out.println("two2.number="+two2.getNumber());
		two1.nextNumber();
		System.out.println("调用nextnumber方法后:");
		System.out.println("two1.number="+two1.getNumber());
		System.out.println("two2.number="+two2.getNumber());
		
		
	}
}

                   

                   

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.