一. 概念
單例(Singleton):指一個類只有一個實例,且該類能自行創(chuàng)建這個實例的一種模式。
二. 特點
2.1 單例類只有一個實例對象
2.2 該單例對象必須由一個單例類自行創(chuàng)建
2.3 單例類對外提供一個訪問該類單例的全局訪問點
三. 應用
在有些系統(tǒng)中爹耗,為了節(jié)省資源、保證數(shù)據(jù)內(nèi)同的一致性,對某些類要求只能創(chuàng)建一個實例簿煌,這就是單例模式。
四. 單例模式創(chuàng)建的方式分類
4.1 懶漢模式
該模式的特點是類加載時沒有生成單例鉴吹,只有當?shù)谝淮握{(diào)用 getlnstance 方法時才去創(chuàng)建這個單例姨伟。代碼如下:
public class LazySingleton
{
private static volatile LazySingleton instance=null; //保證 instance 在所有線程中同步
private LazySingleton(){} //private 避免類在外部被實例化
public static synchronized LazySingleton getInstance()
{
//getInstance 方法前加同步
if(instance==null)
{
instance=new LazySingleton();
}
return instance;
}
}
4.2 餓漢模式
該模式的特點是類一旦加載就創(chuàng)建一個單例,保證在調(diào)用 getInstance 方法之前單例已經(jīng)存在了豆励。
public class HungrySingleton
{
private static final HungrySingleton instance=new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance()
{
return instance;
}
}
五. 實例測試
5.1 懶漢模式
package com.hjb.singleton.pojo;
/**
* @DESC 設計模式-單例模式-之懶漢模式創(chuàng)建
* @author HJB
* @date 2020年4月19日 上午10:56:52
*/
public class PresidentPOJO {
public static volatile PresidentPOJO president = init();
private String name;
private Integer age;
private static PresidentPOJO init() {
if (president == null) {
president = new PresidentPOJO();
}
return president;
}
private PresidentPOJO() {
System.out.println("實例化一個總統(tǒng)對象");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "President [name=" + name + ", age=" + age + "]";
}
}
package com.hjb.singleton.start;
import com.hjb.singleton.pojo.PresidentPOJO;
/**
* @DESC 用懶漢式單例模式模擬產(chǎn)生美國當今總統(tǒng)對象
* @author HJB
* @date 2020年4月19日 上午10:54:52
*/
public class SingletonLazy {
public static void main(String[] args) {
PresidentPOJO president1 = PresidentPOJO.president;
president1.setName("奧巴馬");
president1.setAge(55);
PresidentPOJO president2 = PresidentPOJO.president;
president2.setName("特朗普");
president2.setAge(65);
System.out.println(president1);//President [name=特朗普, age=65]
System.out.println(president2);//President [name=特朗普, age=65]
}
}
5.2 餓漢模式
package com.hjb.singleton.pojo;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* @DESC 設計模式-單例模式-餓漢模式
* @author HJB
* @date 2020年4月19日 上午11:11:35
*/
public class CiweiPOJO extends JPanel{
private static final long serialVersionUID = 1L;
public static CiweiPOJO ciwei = new CiweiPOJO();
private CiweiPOJO() {
JLabel jl = new JLabel(new ImageIcon("D:\\photos\\ciwei.jpg"));
this.add(jl);
}
public static CiweiPOJO instance() {
return ciwei;
}
}
package com.hjb.singleton.start;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JFrame;
import com.hjb.singleton.pojo.CiweiPOJO;
/**
* @DESC 用餓漢式單例模式模擬產(chǎn)生刺猬對象夺荒。
* @author HJB
* @date 2020年4月19日 上午11:23:25
*/
public class SingletonEager {
public static void main(String[] args) {
JFrame jf=new JFrame("餓漢單例模式測試");
jf.setLayout(new GridLayout(1,2));
Container contentPane=jf.getContentPane();
CiweiPOJO obj1=CiweiPOJO.instance();
contentPane.add(obj1);
CiweiPOJO obj2=CiweiPOJO.instance();
contentPane.add(obj2);
if(obj1==obj2)
{
System.out.println("他們是同一人!");
}
else
{
System.out.println("他們不是同一人良蒸!");
}
jf.pack();
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}