一 簡介
設計模式,嘿嘿,聽起來很高端,其實這個東西真正入門就會發現,他並不是什麼高深的代碼或者算法。我覺得他就是一個利用反射機制,繼承,多態,重載,泛型等基本的語言特性來實現高性能,簡介,易於擴展維護的代碼。是前輩們常年累月編寫總結出來的經驗,就像什麼時候種什麼蔬菜一樣。所以學習的時候,要有信心,其中奧妙會讓你恍然大悟。
設計模式分類最招監獄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配置文件都是實例化爲一個單例。採用的就是單例模式。單例模式保證了你的一個進程裏面只會只有一個實例。