標籤:eal 優缺點 接受 bsp console 方法 rgs 步驟 app
一.設計遵循法則
設計模式是在特定環境下人們解決某類重複出現問題的一套成功或有效解決方案.
設計模式目前種類: GoF 的 23 種 + “簡單原廠模式” = 24 種。
設計模式的作用:高內聚低耦合
軟體開發的原則:
迪米特: 多組合 少繼承
裡式替換: 多態
合成複用: 多組合,少繼承
依賴倒轉:
單一:
開閉:
二.簡單工廠
一個抽象父類 N個實作類別 還有一個工廠
參數不同 結果不同 父類返回 switch 簡單工廠(變形
代碼執行個體:
1 using System; 2 namespace day24 3 { 4 public abstract class Phone//父類 5 { 6 public string PhoneName; 7 public abstract void Show(); 8 } 9 public class FSK//工廠10 {11 public static Phone CreatePhoneByName(string phoneName)12 {13 Phone returnValue;14 switch (phoneName)15 {16 case "Apple":17 returnValue = new ApplexRS();18 returnValue.PhoneName = "AppleXRS";19 return returnValue;20 case "Mi":21 returnValue = new MIMix3();22 returnValue.PhoneName = "MIMix3";23 return returnValue;24 case "HuaWei":25 returnValue = new HuaWeics();26 returnValue.PhoneName = "HuaWeics";27 return returnValue;28 case "MeiTu":29 returnValue = new MeiTu();30 returnValue.PhoneName = "MeiTu";31 return returnValue;32 }33 return null;34 }35 }36 public class HuaWeics : Phone//子類0137 {38 public override void Show()39 {40 Console.WriteLine("我是{0}手機 我在展示最新功能!", PhoneName);41 }42 }43 public class MIMix3 : Phone//子類0244 {45 public override void Show()46 {47 Console.WriteLine("我是{0}手機 我在展示最新功能!", PhoneName);48 }49 }50 public class MeiTu : Phone//子類0351 {52 public override void Show()53 {54 Console.WriteLine("我是{0}手機 我在展示最新功能!", PhoneName);55 }56 }57 public class ApplexRS : Phone//子類0458 {59 public override void Show()60 {61 Console.WriteLine("我是{0}手機 我在展示最新功能!", PhoneName);62 }63 }64 internal class Program//實現65 {66 public static void Main(string[] args)67 {68 //傳遞參數給富士康, 富士康接受參數返回結果69 Phone createPhone = FSK.CreatePhoneByName("MeiTu");70 createPhone.Show();71 }72 }73 }View Code
優缺點:
優點: 實現了對象建立和使用的分離。
不需要記住具體類名,記住參數即可,減少使用者記憶量。
缺點: 對工廠類職責過重,一旦不能工作,系統受到影響。
增加系統中類的個數,複雜度和理解度增加。
違反“開閉原則”,添加新產品需要修改工廠邏輯,工廠越來越複雜。
三.Factory 方法
一個物品對應一個工廠! 實現自給自足
代碼執行個體:
1 using System; 2 namespace Factory 方法 3 { 4 public abstract class AbsPhone//手機父類 5 { 6 public abstract void Show(); 7 } 8 public abstract class AbsFac//工廠父類 9 {10 public abstract AbsPhone CreatePhone();11 }12 public class HuaWei : AbsPhone//手機子類0113 {14 public override void Show()15 {16 Console.WriteLine("我是華為手機");17 }18 }19 public class HuaWeiFac : AbsFac//工廠子類0120 {21 public override AbsPhone CreatePhone()22 {23 return new HuaWei();24 }25 }26 internal class Program//主函數27 {28 // 一個物體對應一個工廠29 public static void Main(string[] args)30 {31 Console.Read();32 }33 }34 }View Code
優缺點:
優點: 不需要記住具體類名,甚至連具體參數都不用記憶。
實現了對象建立和使用的分離。
系統的可擴充性也就變得非常好,無需修改介面和原類
缺點: 增加系統中類的個數,複雜度和理解度增加。
增加了系統的抽象性和理解難度。
四.單例模式
單---->唯一 單個
例----> 執行個體 對象
步驟:
1).定義靜態私人對象
2).建構函式私人化
3).定義一個靜態 傳回值為該類型的方法 一般以Getinstance/getInit為方法名稱
單例模式有懶漢和惡漢,懶漢線程不安全 最好使用餓漢.
代碼執行個體
懶漢模式:後執行個體化
1 using System; 2 namespace 單例模式 3 { 4 // 定義靜態私人對象 5 // 建構函式私人化 6 //定義一個靜態 傳回值為該類型的方法 一般以Getinstance/getInit為方法名稱 7 class Singleton 8 { 9 private static Singleton _singleton;//第一步10 private Singleton()//第二步11 {12 //初始化13 }14 public static Singleton GetInstance()//第三步15 {16 if (null == _singleton)17 {18 _singleton = new Singleton();19 Console.WriteLine("呵呵");20 }21 return _singleton;22 }23 } 24 internal class Program25 {26 public static void Main(string[] args)27 {28 for (int i = 0; i < 100; i++)29 {30 Singleton.GetInstance();31 }32 }33 }34 }View Code
餓漢模式:先執行個體化
1 public class HungrySingle 2 { 3 4 private static HungrySingle sInstance = new HungrySingle();//第一步 5 6 private HungrySingle() //第二步 7 { 8 9 }10 11 public static HungrySingle getInstance() //第三步12 {13 return sInstance;14 }15 16 }View Code
unity裡面的單利模式的寫法:
1 public sealed class SingletonMoBehaviour: MonoBehaviour 2 { 3 private static volatile SingletonBehaviour instance; 4 private static object syncRoot = new Object(); 5 public static SingletonBehaviour Instance 6 { 7 get 8 { 9 if (instance == null) 10 { 11 lock (syncRoot) 12 { 13 if (instance == null) {14 SingletonBehaviour[] instances = FindObjectsOfType<SingletonBehaviour>();15 if (instances != null){16 for (var i = 0; i < instances.Length; i++) {17 Destroy(instances[i].gameObject);18 }19 }20 GameObject go = new GameObject("_SingletonBehaviour");21 instance = go.AddComponent<SingletonBehaviour>();22 DontDestroyOnLoad(go); 23 }24 } 25 } 26 return instance; 27 } 28 } 29 }View Code
懶漢和惡漢有區別,但是在unity裡面都行,因為不涉及多線程!!!
拓展知識:
線程: 是CPU直接切換的 並行
進程: 是分配資源的單位
設計模式----設計遵循法則及(簡單工廠,Factory 方法,單例模式)(2018/10/29)