本文主要是介绍Java设计模式之单件模式(四),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
所有设计模式传送门
单件模式又叫单例模式,一种大家最熟悉也是比较好理解的设计模式。它保证一个类仅有一个实例,并提供一个访问它的全局访问点。
在某些情况下,我们可能需要某个类只能创建出一个对象,即不让用户用该类实例化出多余两个的实例。比如:在一个公文管理系统中,公文类的实例“公文文件”, 需要将公章类的实例作为自己的一个成员,以表明自己是一个有效的公文文件,那么系统
的设计者就需要保证公章只有一个实例,不能允许使用公章类的构造方法再创建出第2个公章。单件模式是关于怎么样设计一个类,并使该类只有一个实例的成熟模式,该模式的关键是将 类的构造方法设置为private权限,并提供一个返回它的唯一实例的类方法(static方法)。
包含一种角色:
单件类(Singleton):该类只可以创建出一个实例。
优点:单件类的唯一实例由单件类本身控制,所以可以很好的控制用户何时访问它。
适用情景:当系统需要某个类只能有一个实例。
以下是JAVA实现单例类的代码:
public class Singleton{private static Singleton uniqueInstance = new Singleton(); //JVM加载时创建private Singleton(){} //构造方法时private权限public static Sinleton getInstance(){return uniqueInstance;}
}
若程序希望用户需要时在创建单件类的唯一实例,即用户调用单件类提供的类方法时在创建它,那么为了防止单线程在调用这个类方法时创建多个单件类的实例,可以将方法设置为同步方法。以下是JAVA实现单件类的代码:
public class Singleton{private static Singleton uniqueInstance;private Singleton(){}public static synchronieze Singleton getInstance(){if(uniqueInstance==null){uniqueInstance = new Singleton(); }return uniqueInstance;}
}
简单的例子:创建唯一的月亮
public class Moon {private static Moon uniqueMoon;double radius;double distanceToEarth;private Moon() {uniqueMoon = this;radius = 1738;distanceToEarth = 363300;}public static synchronized Moon getMoon() {if (uniqueMoon==null) {uniqueMoon = new Moon();}return uniqueMoon;}public String show(){String string = "月亮的半径是"+radius+"km,距地球是"+distanceToEarth+"km";return string;}
}public class Application {public static void main(String[] args) {MyFrame f1 = new MyFrame("张三看月亮");MyFrame f2 = new MyFrame("李四看月亮");f1.setBounds(10,10,360,150);f2.setBounds(370,10,360,150);f1.validate();f2.validate();}
}
class MyFrame extends JFrame{String string;public MyFrame(String title) {setTitle(title);Moon moon = Moon.getMoon(); //得到单件类的唯一实例string = moon.show();setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);setVisible(true);repaint();}public void paint(Graphics g) {super.paint(g);g.setFont(new Font("宋体", Font.BOLD, 14));g.drawString(string, 5, 100);}
}
运行效果:
这篇关于Java设计模式之单件模式(四)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!