設計模式---單例模式

一 簡介

設計模式,嘿嘿,聽起來很高端,其實這個東西真正入門就會發現,他並不是什麼高深的代碼或者算法。我覺得他就是一個利用反射機制,繼承,多態,重載,泛型等基本的語言特性來實現高性能,簡介,易於擴展維護的代碼。是前輩們常年累月編寫總結出來的經驗,就像什麼時候種什麼蔬菜一樣。所以學習的時候,要有信心,其中奧妙會讓你恍然大悟。

設計模式分類最招監獄Erich Gamma 在德國慕尼黑大學的博士論文中。1995年有他們小組合著的《DesignPattems Elements of Reusable Object Oriented Software》 系統的整理和描述了23個精選的設計模式。按照功能它們分爲創建型,結構型,行爲型三種。個人只列舉了大學裏面經常用到的一些模式。至於其他模式讀者可以參閱百度。

我學習每一種設計模式的時候我都會問自己三個問題:A,該模式的原理。B代碼如何實現該模式。C,爲什麼會總結出這種模式。後面就是按照這個思路走下去的。

 

二 創建型

2.1 單例模式

A 什麼是單例模式

保證一個類只有一個實例,並提供一個訪問他的全局訪問點;

B 如何實現單例模式

場景:在一個投票系統中,票數VoteCount應該只有一個實例,所有參與投票的人只對這一個實例進行修改。

類圖:

 

 

代碼實現:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Singleton

{

    class Program

    {

 

        static void Main(string[] args)

        {

            Vote vote = Vote.getInstance();

            Console.WriteLine(vote.getVoteCount());

            People people1= new People("程晗");

            people1.doVote();

            Console.WriteLine(vote.getVoteCount());

            People people2= new People("曹霜");

           people2.doVote();

            Console.WriteLine(vote.getVoteCount());

 

        }

 

 

    }

    ///<summary>

    ///創建一個票的類

    ///</summary>

    class Vote

    {

        private static Voteinstance = null;

        public static Vote getInstance() {

            if (instance == null)

            {

                instance = new Vote();

            }

            return instance;

        }

        private  int voteCount = 0;

        public VotegetVote()

        {

            return new Vote();

        }

        public voiddoVoteCount()

        {

           voteCount++;

        }

 

        public StringgetVoteCount()

        {

            return "當前票數爲:" +voteCount;

        }

 

    }

    ///<summary>

    ///創建一個人來投票

    ///</summary>

    class People

    {

        private string name;

        bool isVote= true;

        public People(String name)

        {

            this.name =name;

        }

        public StringdoVote()

        {

            if (isVote== true)

            {

                Vote vote=  Vote.getInstance();

               vote.doVoteCount();

               isVote = false;

                Console.WriteLine(this.name + "投票成功!");

                return "投票成功";

            }

            else

            {

                Console.WriteLine(this.name + "投票失敗,您已經投過");

                return "投票失敗,您已經投過";

            }

        }

    }

 

}

 

 

運行結果:


結果分析:

       難度不大!

C. 爲什麼要用單例模式

在我理解看來,不僅僅是計數,在許多地方你的都會用到單例模式。比如在我們的運維工具中每個config配置文件都是實例化爲一個單例。採用的就是單例模式。單例模式保證了你的一個進程裏面只會只有一個實例。

發佈了30 篇原創文章 · 獲贊 2 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章