真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

設(shè)計模式(創(chuàng)建型)之單例模式

單例模式的目的就是要控制特定的類只產(chǎn)生一個對象,當(dāng)然也允許在一定情況下靈活的改變對象的個數(shù)。

10年積累的成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有渾源免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

 

怎么來實(shí)現(xiàn)單例模式呢?

一個類的對象的產(chǎn)生是由類構(gòu)造函數(shù)來完成的,如果想限制對象的產(chǎn)生,一個辦法就是:

1,將構(gòu)造函數(shù)變?yōu)樗接械?/strong>(至少是受保護(hù)的),使得外面的類不能通過引用來產(chǎn)生對象;

2,同時為了保證類的可用性,就必須提供一個自己的對象以及訪問這個對象的靜態(tài)方法。

 

單例模式可分為有狀態(tài)的和無狀態(tài)的。

有狀態(tài)的單例對象一般也是可變的單例對象,多個單態(tài)對象在一起就可以作為一個狀態(tài)倉庫一樣向外提供服務(wù)。

沒有狀態(tài)的單例對象也就是不變單例對象,僅用做提供工具函數(shù)。

 

UML類圖:

設(shè)計模式(創(chuàng)建型)之單例模式

實(shí)現(xiàn):

java:

一、餓漢式:

singleton1.java:

/*
 * 創(chuàng)建人:顏超
 * 創(chuàng)建時間:2013-6-26
 * 文件名:singleton1.java
 * 創(chuàng)建型設(shè)計模式
 * 單例(singleton)
 * 餓漢式
 */
public class Singleton1 {
 //在自己內(nèi)部定義自己一個實(shí)例
 //注意這是private 只供內(nèi)部調(diào)用
 private static Singleton1 instance = new Singleton1();
 //將構(gòu)造函數(shù)設(shè)置為私有
 private Singleton1(){
  System.out.println("new an instance!");
 }
 //靜態(tài)工廠方法,提供了一個供外部訪問得到對象的靜態(tài)方法
 public static Singleton1 getInstance(){
  return instance;
 }
 public static void main(String[] args) {
  Singleton1.getInstance();
 }
}

二、懶漢式:

singleton2.java:

/*
 * 創(chuàng)建人:顏超
 * 創(chuàng)建時間:2013-6-26
 * 文件名:singleton2.java
 * 創(chuàng)建型設(shè)計模式
 * 單例(singleton)
 * 懶漢式
 */
public class Singleton2 {
 private static Singleton2 instance = null;
 private Singleton2(){
  System.out.println("new an instance!");
 }
 //對靜態(tài)工廠方法進(jìn)行了同步處理,原因很明顯——為了防止多線程環(huán)境中產(chǎn)生多個實(shí)例
 //將類對自己的實(shí)例化延遲到第一次被引用的時候。而在"餓漢式"則是在類被加載的時候?qū)嵗@樣多次加載會造成多次實(shí)例化
 public static synchronized Singleton2 getInstance(){
  if (instance == null){
   instance = new Singleton2();
  }
  return instance;
 }
 public static void main(String[] args) {
 // Singleton1 s1 = new Singleton1();
  Singleton2.getInstance();
 }
}
三、

以上兩種實(shí)現(xiàn)方式均失去了多態(tài)性,不允許被繼承。還有另外一種靈活點(diǎn)的實(shí)現(xiàn),將構(gòu)造函數(shù)設(shè)置為受保護(hù)的,這樣允許被繼承產(chǎn)生子類。

singleton3.java:

import java.util.HashMap;

public class Singleton3 {
 private static HashMap sinRegistry = new HashMap();
 private static Singleton3 instance = new Singleton3();
 protected Singleton3(){
  System.out.println("Construction for Singleton3!");
 }
 public static Singleton3 getInstance(String name){
  if (name == null){
   name = "Singleton3";
  }
  if (sinRegistry.get(name) == null){
   try{
    sinRegistry.put(name, Class.forName(name).newInstance());
   }catch(Exception e){
    e.printStackTrace();
   }
  }
  return (Singleton3)(sinRegistry.get(name));
 }

 public void test(){
  System.out.println("get Class Success!");
 }
}

class Singleton3Child1 extends Singleton3 {

 public Singleton3Child1(){
  System.out.println("Construction for Singleton3Child1!");
 }
 public static Singleton3Child1 getInstance(){
  return (Singleton3Child1)Singleton3.getInstance("Singleton3Child1");
 }
 public void test(){
  System.out.println("get Child1 Class Success!");
 }
}

class Singleton3Child2 extends Singleton3 {

 public Singleton3Child2(){
  System.out.println("Construction for Singleton3Child2!");
 }
 public static Singleton3Child2 getInstance(){
  return (Singleton3Child2)Singleton3.getInstance("Singleton3Child2");
 }
 public void test(){
  System.out.println("get Child2 Class Success!");
 }
}

testMain.java:

public class testMain {

 /**
  * @param args
  */
 public static void main(String[] args) {
  System.out.println("#########################");
  Singleton3Child1 s3c1 = new Singleton3Child1();
  Singleton3Child2 s3c2 = new Singleton3Child2();
  // 因?yàn)閔ashmap的key值是唯一的,所以,下面的三部分一次只能顯示一部分

  System.out.println("#########################");
  Singleton3Child1.getInstance(); //add Singleton3Child1 into hashmap 
  Singleton3Child2.getInstance(); //add Singleton3Child2 into hashmap 
  System.out.println("#########################");
  Singleton3.getInstance("Singleton3Child1"); //add Singleton3Child1 into hashmap 
  Singleton3.getInstance("Singleton3Child2"); //add Singleton3Child2 into hashmap 
  System.out.println("#########################");
  Singleton3Child1.getInstance("Singleton3Child1"); //add Singleton3Child1 into hashmap 
  Singleton3Child1.getInstance("Singleton3Child2"); //add Singleton3Child2 into hashmap 
  Singleton3Child2.getInstance("Singleton3Child1"); //add Singleton3Child1 into hashmap 
  Singleton3Child2.getInstance("Singleton3Child2"); //add Singleton3Child2 into hashmap 

 }

}

 

由于在 java 中子類的構(gòu)造函數(shù)的范圍不能比父類的小,所以可能存在不守規(guī)則的客戶
程序使用其構(gòu)造函數(shù)來產(chǎn)生實(shí)例,造成單例模式失效。

 

C++:

Singleton.cpp:

#include 
using namespace std;

class Singleton{

public:
 static Singleton* getInstance(){
  if(instance == NULL){
   cout << "There is no instance!!!" << endl;
   instance = new Singleton();
  }
  return instance;
 }
private:
 Singleton(){
  cout << "new an instance!!!" << endl;
 }
 static Singleton* instance;
};

// static variable "instance" can not initialized in class
Singleton* Singleton::instance = NULL;

int main() {
 Singleton::getInstance();
 return 0;
}

 


當(dāng)前名稱:設(shè)計模式(創(chuàng)建型)之單例模式
當(dāng)前路徑:http://weahome.cn/article/pchosi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部