一個簡單的單例模式

        單例模式
單例模式(Singleton Pattern)是java中最簡單的設計模式之一。這種模式涉及到一個單一的類,該類
負責建立本身的對象,同時確保只有單個對象被建立。這個類提供了一種訪問其文藝的對象的方式,
能夠直接訪問,不須要實例化該類的對象。
注意點:
    1.單例類只能有一個實例。
    2.單例類必須本身建立本身的惟一實例。
    3.單例類必須給全部其餘對象提供這一實例。
下面咱們就以一個簡單的生產蘋果與吃蘋果的小例子說一下單例模式:
(注:生產一個蘋果才能吃一個蘋果,生產蘋果在先,吃蘋果在後,順序不能亂,因此我把生產蘋果的
    方法和吃蘋果的方法都放在了單例類中)
話很少說,上代碼。
第一步:建立一個單例類(FactoryApple)java

package com.singleton;

public class FactoryApple {
	// 初始化工廠的蘋果數量爲0
	private int apple = 0;
	// Y 表示能夠生產蘋果
	// N 表示能夠吃蘋果
	private String flag = "Y";

	/**
	 * 生產蘋果
	 */
	public synchronized void productApple() {
		if ("Y".equals(flag)) {
			try {
				apple++;
				System.out.println(Thread.currentThread().getName() + "生產了第" + apple + "個蘋果");
				flag = "N";
				super.wait();
				super.notify();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 吃蘋果
	 */
	public synchronized void eatApple() {
		if ("N".equals(flag)) {
			try {
				System.out.println(Thread.currentThread().getName() + "吃掉了第" + apple + "個蘋果");
				flag = "Y";
				super.notify();
				super.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

注意代碼中兩個方法體中的super.wait(),super.notify()順序,這樣作的目的就是當最後一次生產蘋果的設計模式

時候,因爲循環結束,生產蘋果再也不執行,沒有人去喚醒吃蘋果,形成程序沒有運行完。app


第二步:建立生產蘋果和吃蘋果的類(Producer,Consumer)ide

package com.singleton;

public class Producer implements Runnable {

	private FactoryApple factoryApple;

	public Producer(FactoryApple factoryApple) {
		this.factoryApple = factoryApple;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			factoryApple.productApple();
		}

	}

}



package com.singleton;

public class Consumer implements Runnable {

	private FactoryApple factoryApple;

	public Consumer(FactoryApple factoryApple) {
		this.factoryApple = factoryApple;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			factoryApple.eatApple();
		}

	}

}


第三步:測試(test)測試

package com.singleton;

public class Test {
	public static void main(String[] args) {
		FactoryApple factoryApple = new FactoryApple();

		Producer p = new Producer(factoryApple);
		Thread t1 = new Thread(p, "生產者");
		t1.start();

		Consumer c = new Consumer(factoryApple);
		Thread t2 = new Thread(c, "消費者");
		t2.start();
	}

}
相關文章
相關標籤/搜索