单例模式
单例模式(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(); } }