C# 设计模式
单例模式
1、某个对象只需要一个实例的情况;
2、定义一个静态变量来保存类的实例;
3、定义私有构造函数,使外界不能创建该类实例;
4、定义公有方法提供一个全局访问点;
// 该类不是一个公开类 // 但是该类的实现应用了单例模式 internal sealed class SR { private static SR loader; internal SR() { } // 主要是因为该类不是公有,所以这个全部访问点也定义为私有的了 // 但是思想还是用到了单例模式的思想的 private static SR GetLoader() { if (loader == null) { SR sr = new SR(); Interlocked.CompareExchange<SR>(ref loader, sr, null); } return loader; } // 这个公有方法中调用了GetLoader方法的 public static object GetObject(string name) { SR loader = GetLoader(); if (loader == null) { return null; } return loader.resources.GetObject(name, Culture); } }
简单工厂模式
1、定义一个抽象类,子类根据自我需求实现不同的行为;
2、定义一个工厂,用户传入参数,根据参数创建不同的对象,返回对象;
其实是将创建对象的过程汇总到抽象工厂中。
优点:简单工厂模式实现了对责任的分割。代码的复用。别的地方创建可能还是需要复杂的逻辑判断,减少代码;
/// <summary> /// 顾客充当客户端,负责调用简单工厂来生产对象 /// 即客户点菜,厨师(相当于简单工厂)负责烧菜(生产的对象) /// </summary> class Customer { static void Main(string[] args) { // 客户想点一个西红柿炒蛋 Food food1 = FoodSimpleFactory.CreateFood("西红柿炒蛋"); food1.Print(); // 客户想点一个土豆肉丝 Food food2 = FoodSimpleFactory.CreateFood("土豆肉丝"); food2.Print(); Console.Read(); } } /// <summary> /// 菜抽象类 /// </summary> public abstract class Food { // 输出点了什么菜 public abstract void Print(); } /// <summary> /// 西红柿炒鸡蛋这道菜 /// </summary> public class TomatoScrambledEggs : Food { public override void Print() { Console.WriteLine("一份西红柿炒蛋!"); } } /// <summary> /// 土豆肉丝这道菜 /// </summary> public class ShreddedPorkWithPotatoes : Food { public override void Print() { Console.WriteLine("一份土豆肉丝"); } } /// <summary> /// 简单工厂类, 负责 炒菜 /// </summary> public class FoodSimpleFactory { public static Food CreateFood(string type) { Food food = null; if (type.Equals("土豆肉丝")) { food= new ShreddedPorkWithPotatoes(); } else if (type.Equals("西红柿炒蛋")) { food= new TomatoScrambledEggs(); } return food; } }
工厂方法模式
1、简单模式缺点:难以扩展工厂创建---扩展导致逻辑判断复杂
2、工厂类:给出工厂必须实现的接口,创建对相应的工厂;
namespace 设计模式之工厂方法模式 { /// <summary> /// 菜抽象类 /// </summary> public abstract class Food { // 输出点了什么菜 public abstract void Print(); } /// <summary> /// 西红柿炒鸡蛋这道菜 /// </summary> public class TomatoScrambledEggs : Food { public override void Print() { Console.WriteLine("西红柿炒蛋好了!"); } } /// <summary> /// 土豆肉丝这道菜 /// </summary> public class ShreddedPorkWithPotatoes : Food { public override void Print() { Console.WriteLine("土豆肉丝好了"); } } /// <summary> /// 抽象工厂类 /// </summary> public abstract class Creator { // 工厂方法 public abstract Food CreateFoddFactory(); } /// <summary> /// 西红柿炒蛋工厂类 /// </summary> public class TomatoScrambledEggsFactory:Creator { /// <summary> /// 负责创建西红柿炒蛋这道菜 /// </summary> /// <returns></returns> public override Food CreateFoddFactory() { return new TomatoScrambledEggs(); } } /// <summary> /// 土豆肉丝工厂类 /// </summary> public class ShreddedPorkWithPotatoesFactory:Creator { /// <summary> /// 负责创建土豆肉丝这道菜 /// </summary> /// <returns></returns> public override Food CreateFoddFactory() { return new ShreddedPorkWithPotatoes(); } } /// <summary> /// 客户端调用 /// </summary> class Client { static void Main(string[] args) { // 初始化做菜的两个工厂() Creator shreddedPorkWithPotatoesFactory = new ShreddedPorkWithPotatoesFactory(); Creator tomatoScrambledEggsFactory = new TomatoScrambledEggsFactory(); // 开始做西红柿炒蛋 Food tomatoScrambleEggs = tomatoScrambledEggsFactory.CreateFoddFactory(); tomatoScrambleEggs.Print(); //开始做土豆肉丝 Food shreddedPorkWithPotatoes = shreddedPorkWithPotatoesFactory.CreateFoddFactory(); shreddedPorkWithPotatoes.Print(); Console.Read(); } } }
抽象工厂
/// <summary> /// 如果绝味又想开一家湖南的分店时,因为湖南喜欢吃麻的 /// 所以这是有需要有一家湖南的工厂专门制作 /// </summary> public class HuNanFactory : AbstractFactory { // 制作湖南鸭脖 public override YaBo CreateYaBo() { return new HuNanYaBo(); } // 制作湖南鸭架 public override YaJia CreateYaJia() { return new HuNanYajia(); } } /// <summary> /// 湖南的鸭脖 /// </summary> public class HuNanYaBo : YaBo { public override void Print() { Console.WriteLine("湖南的鸭脖"); } } /// <summary> /// 湖南的鸭架 /// </summary> public class HuNanYajia : YaJia { public override void Print() { Console.WriteLine("湖南的鸭架子"); } }
缺点:抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。