建设银行官方网站登录网址,学做粤菜的网站有哪些,产品销售类网站 模板,如何注册一个免费域名设计模式知道#xff0c;套路是个啥#xff1f;关于设计模式的说法#xff0c;网上一搜一大堆#xff0c;咱就不再去说了。我的理解#xff0c;设计模式就是很多NB的大佬们总结出来的#xff0c;用来处理特定情况的标准解决方案。那既然是标准方案#xff0c;就一定会有… 设计模式知道套路是个啥关于设计模式的说法网上一搜一大堆咱就不再去说了。我的理解设计模式就是很多NB的大佬们总结出来的用来处理特定情况的标准解决方案。那既然是标准方案就一定会有套路会有标准的样子。几种常见的设计模式都有各自的套路模板。下面进入主题咱们一个一个来说。一、抽象工厂模式抽象工厂主要的场景是创建一系列相关或相似的对象。注意这个相关或相似。因为有这个特性我们就可以抽取出共同点来形成接口或抽象类然后通过这个接口或抽象类来派生出各个对象。为什么叫抽象工厂不知道而且不重要。在我看来这只是个名字记下就好。一个东西出来总要有个名字的有个人跑出来说就叫抽象工厂吧。于是就叫抽象工厂了。就像一个人做了一个网站让别人在上面卖东西后来做大了需要吹NB了得给这个经营方式起个名字于是B2C 就出现了。现在人们创业做电商头一件事先讨论做 B2B 还是 B2C。做反了。先做吧挣钱要紧。做大了你说叫什么都会有人听、有人信。说跑题了:P先写几个类型包括接口和实体类后面会用到// 接口定义
public interface ILaptop
{void GetInfo();
}
public interface IMobile
{void GetInfo();
}// 实体类一
public class MateBook : ILaptop
{public void GetInfo(){Console.WriteLine(I am MateBook);}
}
public class Mac : ILaptop
{public void GetInfo(){Console.WriteLine(I am Mac);}
}// 实体类二
public class Mate : IMobile
{public void GetInfo(){Console.WriteLine(I am Mate);}
}
public class IPhone : IMobile
{public void GetInfo(){Console.WriteLine(I am IPhone);}
}有了上面的类型我们来看看抽象工厂的套路。定义public interface IFactory
{ILaptop CreateLaptop();IMobile CreateMobile();
}
public class FactoryA : IFactory
{public ILaptop CreateLaptop(){return new MateBook();}public IMobile CreateMobile(){return new Mate();}
}
public class FactoryB : IFactory
{public ILaptop CreateLaptop(){return new Mac();}public IMobile CreateMobile(){return new IPhone();}
}调用public static class Example
{public static void ExampleTest(){var factoryA new FactoryA();var laptopA factoryA.CreateLaptop();var mobileA factoryA.CreateMobile();laptopA.GetName();mobileA.GetName();var factoryB new FactoryB();var laptopB factoryB.CreateLaptop();var mobileB factoryB.CreateMobile();laptopB.GetName();mobileB.GetName();}//result ://I am MateBook//I am Mate//I am Mac//I am IPhone
}这个模式里面核心的部分就是工厂接口的定义public interface IFactory
{ILaptop CreateLaptop();IMobile CreateMobile();
}在这个工厂接口中加入了多个相似的接口。于是调用端可以很简单的以类似的方式去调用而工厂实体中对内部引用的实体进行区分。一个典型的场景是一个程序对着很多种数据库。这样的情况可以在工厂实体中区分具体连接哪种数据库而内部的引用实体则各自对应不同的数据库。外部调用时只需要在初始化时确认使用哪种数据库后面的 CRUD 操作就直接使用就成调用端不需要考虑数据库的区别。事实上这也是抽象工厂用的最多的场景。二、工厂模式去掉了抽象两个字居然还是一个模式而且是一个不同的模式。这个名字起的够混乱。不过老实说工厂模式跟抽象工厂模式很像区别是抽象工厂模式是在工厂模式的基础上又做了一层抽象。看套路public interface IFactory
{ILaptop CreateLaptop();
}
public class FactoryA : IFactory
{public ILaptop CreateLaptop(){return new MateBook();}
}
public class FactoryB : IFactory
{public ILaptop CreateLaptop(){return new Mac();}
}
public static class Example
{public static void Test(){var factoryA new FactoryA();var laptopA factoryA.CreateLaptop();laptopA.GetName();var factoryB new FactoryA();var laptopB factoryB.CreateLaptop();laptopB.GetName();}//result ://I am MateBook//I am Mac
}看到了吧跟抽象工厂确实很相似。不过在使用上工厂模式用得会更多。任何类都可以按工厂模式来写。这个模式最大的作用是把定义和实体做了分层。开发时可以一部分人去定义接口而另一部分人去实现这个接口。而且工作模式可以随时扩展为抽象工厂。比方一开始只是可能有多种数据库但具体是哪些数据库还没确定就可以先按工厂模式写等数据库定下来随时就很容易转为抽象工厂了。三、建造者模式这个名称起的更不知所云了就因为一个 Builder?其实他说的是这么个事。我们经常看到这样的代码var mobile new MobileBuilder().WithBrand(Apple).WithModel(13Pro).WithMemory(512G).Build();看着是不是很洋气来看看这个套路// 这就是个数据模型
public class Mobile
{public string Brand { get; set; }public string Model { get; set; }public string Memory { get; set; }
}// 这才是 Builder 的定义
public class MobileBuilder
{private readonly Mobile _mobile new Mobile();public MobileBuilder WithBrand(string brand){_mobile.Brand brand;return this;}public MobileBuilder WithModel(string model){_mobile.Model model;return this;}public MobileBuilder WithMemory(string memory){_mobile.Memory memory;return this;}public Mobile Build(){return _mobile;}
}然后就可以这样调用了public static class Example
{public static void Test(){var mobile new MobileBuilder().WithBrand(Apple).WithModel(13Pro).WithMemory(512G).Build();Console.WriteLine(mobile.ToJson());}//result ://{Brand:Apple,Model:13Pro,Memory:512G}
}个人而言我很喜欢这个套路没有别的就是洋气非常的洋气。应用场景也非常多所有数据的 DTO都可以么写。四、原型模式这个模式听着会有点陌生。看过一些文章也把它归为是创建型模式。实际上我更倾向于把它看作是一种代码结构而不是模式。这种结构最大的作用是复制 - 通过复制一个存在的实例来创建新实例。代码是这样的public class MobilePackage
{public string Color { get; set; }public Mobile Mobile { get; set; }// 下面才是模式代码public MobilePackage ShallowCopy(){return (MobilePackage)this.MemberwiseClone();}public MobilePackage DeepCopy(){var clone (MobilePackage)this.MemberwiseClone();clone.Color new string(Color);clone.Mobile new Mobile{Brand new string(Mobile.Brand),Model new string(Mobile.Model),Memory new string(Mobile.Memory),};return clone;}
}看看其实就是一段复制代码。但是要注意对于深拷贝和浅拷贝涉及到指针和引用如果你不熟悉了解后再用。看一下上面的结果public static class Example
{public static void Test(){var mobilePackage new MobilePackage{Color White,Mobile new Mobile{Brand Apple,Model 13Pro,Memory 512G,}};var shallowCopied mobilePackage.ShallowCopy();var deepCopied mobilePackage.DeepCopy();mobilePackage.Color Black;mobilePackage.Mobile.Brand Huawei;mobilePackage.Mobile.Model Mate;Console.WriteLine(mobilePackage.ToJson());Console.WriteLine(shallowCopied.ToJson());Console.WriteLine(deepCopied.ToJson());}//result://{Color:Black,Mobile:{Brand:Huawei,Model:Mate,Memory:512G}}//{Color:White,Mobile:{Brand:Huawei,Model:Mate,Memory:512G}}//{Color:White,Mobile:{Brand:Apple,Model:13Pro,Memory:512G}}
}结果和你理解的是不是一样如果不一样去研究一下值和引用的区别。另外C# 10 里新出来的 Record就是一个典型的原型模式的类型也可以了解一下。五、单例模式单例模式也是一个用处非常大的模式而且这个名字起得挺直白。单例模式简单点说就是不管你 new 多少回实际应用全局内存中只会有一份实例。套路代码特别简单public sealed class Singleton
{private static Singleton _instance;private static readonly object _locker new object();private Singleton(){}public static Singleton GetInstance(){if (_instance null){lock (_locker){if (_instance null){_instance new Singleton();}}}return _instance;}
}这里有两个注意点类声明用到 sealed 关键字以确保这个类不会被派生。类构造函数用了 private以确保这个类不会被 new。这本身与单例无关只是通过这种方式来表明这是一个单例。控制单例的最核心的代码其实是下面的 GetInstance() 方法。调用时就是下面一行代码Singleton singleton Singleton.GetInstance();就OK了。设计模式有很多种对应的套路也有很多。其中有一些是简单无脑的套路像上面的单例而另一些就会比较复杂。不过既然是套路总是有固定的代码或结构可循的。我这个主题打算分几篇来写。这是第一篇。最后做个小注解套路虽简单也要吃透了再用。而且有时候简单的代码就能很好地完成任务一定不要过度使用。喜欢就来个三连让更多人因你而受益