Web Analytics
yangyang

码农兼一个普普通通小青年

All Posts in 2020.10


C#设计模式之桥接模式

在软件设计中,有一个很常见的问题是“状态空间爆炸”(state space explosion),即同一个对象的多个不想关的实体,用来表示所有可能的状态时,就会出现笛卡尔乘积式的问题。比如,假如我们有不同颜色的红色、蓝色(状态1)不同形状的(状态2)圆形、矩形对象,就要写四个类,比如RedSquare、BlueSquare、RedCircle、BlueCircle。如果增加一种形状,就要增加2个类,增加一种颜色,也要增加2各类。 我们要做的其实就是把一个事物的两个方面“组合”在一起,有多种方法能实现这一点,例如,如果颜色是一个简单特性,我们可以将颜色定义为枚举,如果颜色是可变属性、字段或行为我们就不能把他定义为枚举了。如果硬要这么做,要么代码里会出现很多if..else或者switch,这些分支语句里包含了其他一些不想关 …

Design Pattern Bridge Pattern

C#设计模式之享元模式

Flyweight,fly是苍蝇的意思,拳击里有个“蝇量级”,翻译也是“flyweight”,在设计模式中,Flyweight被翻译成了“享元”,意思是“共享元素”。在一些需要大量小的对象的应用场景,如果想要减少内存占用,可以考虑享元模式。下面举两个例子说明。 Example 1:人名的存储 比如,在英语国家,有很多人叫“John Smith”,如果我们在系统里,就要存储这个名字很多次,那么就需要很多额外的内存来存储相同的名字。相反,如果我们能够只存储某个名字一次,然后其余的都引用这个名字,这样就会节省很多空间。 再比如,可能“Smith”这个姓有很多人用,那么就可以将名字“John”和姓& …

Design Pattern Flyweight Pattern

C#设计模式之装饰模式

假设我们要扩展同事编写的某个类的某些功能,怎样在不修改类的前提下,增加新的功能呢?有一种方法是使用继承,编写一个继承自该基类的子类,然后添加新的方法,或者重写父类里面的某些方法或属性。 问题在于,在有些情况下,并不能继承。最常见的是这个类无法继承,要么是我们编写的类,需要继承自其他类,而在C#里面,不允许多各类继承,再就是这类是封闭的Sealed,无法继承。 Decorator装饰模式,可以使得我们扩展已经存在的类,而不需要修改已经存在类的代码,并且避免了继承导致产生过多子类。下面用一个例子来说明装饰模式。 自定义字符串构造器 假设我们要做一个代码生成器的功能,需要扩展StringBuilder,来增加缩进功能。首先想到的是直接继承自StringBuilder类,但是出于安全原因,这个类是Sealed封闭类,另外,还要保存当前缩进的级别用来给方法 …

Design Pattern Decorator Pattern Dynamic Decorator Static Decorator Decorator Composition

C#设计模式之组合模式

一个对象通常包含(composed)其他对象,或者说聚合(aggregate)其他对象。有一些方法能够让一个对象能够包含其他对象。最简单的是,让这个对象实现IEnumerable<T>接口,或者包含某个实现了IEnumerable<T>对象的public字段。 另外一种方式是继承自一些集合类,比如Collection<T>、List<T>等。因为继承自集合对象,所以对象本身也拥有了相关的存储特性。 因此,什么是组合模式?简单来说是让单个对象跟集合对象一样,让他们拥有相同的接口以及接口对象,这使得我们在使用这些接口及对象时,不需要关心该对象是单个对象还是集合对象。为了说明组合模式,下面举几个例子: 例1:图形对象集合 我们用过PowerPoint,在做PPT的时候,我们有时候选择一个对象,有时候选择多 …

Design Pattern Composite Pattern

C#设计模式之单例模式

单例模式(Singleton),故名思议就是说在整个应用程序中,某一对象的实例只应该存在一个。比如,一个类加载数据库中的数据到内存中以提供只读数据,这就很适合使用单例模式,因为没有必要在内存中加载多份相同的数据,另外,有些情况下不允许内存中存在多分份相同的数据,比如数据过大,内存容不下两份相同数据等等。 约定单例模式(Singleton by Convention) 这种方式有点“Too simple, Sometimes naïve”,他就是提示使用者,我是单例,不要重复初始化我,比如: public class Database { /// <summary> /// 警告,这是单例,不要初始化多次,否则,后果自负. /// </summary> public …

Design Pattern Creational Patterns Singleton

C#设计模式之原型模式

Prototype模式为创建型模式,翻译为原型模式。这种模式在生活中随处可见,很多产品设计一般都不会从头开始,都是从上一个版本直接不停的迭代,比如手机界早前的诺基亚“科技以换壳为本”,以及汽车工业界的更新,一般是过一年一个小改版基本就是“facelift”,然后才是大换代。 在软件工程中亦是如此,在有些情况下,与其从头开始创建一个对象(比如工厂方法模式或者生成器模式做的那样),可以从之前预构造的对象或者直接拷贝原有对象,或者对原有对象简单修改来生成新的对象。 这就产生了原型模式的概念,通过对某个对象的拷贝,定制化从而得到新的对象,原型模式的核心是拷贝,这也是容易出现问题的地方。 深拷贝与浅拷贝 拷贝分为深拷贝(Deep copy)和浅拷贝(Shallow copy)之分,区分两者至关重要。下面来看例子,我们定 …

Design Pattern Prototype Pattern Deep Copy Shallow Copy Prototype Factory

C#设计模式之生成器模式

Builder模式是创建型模式,它用来构建比较复杂的对象,这些对象无法通过单一的构造函数来实现,比如要构造一个类似HTML这样的具有嵌套结构的对象,这个类或许由其他几个类或者对象构成,或者具有一些特殊的构建逻辑。 Builder这里翻译参照GoF翻译为生成器模式,通常用来建造复杂的对象,下面用几个例子来说明,这些例子只是用来说明生成器模式,在实际应用中还要考虑其他因素。 场景 假设我们需要构建一个组件用来显示web页面。一个Web页面可能包含一个或者多个段落,或者其他组件,要构建一个段落,通常可以简单用字符串拼接,比如下面这个代码就构建了一个p段落。 var hello = "hello"; var sb = new StringBuilder(); sb.Append("<p>"); sb.Append(hello); sb. …

Design Pattern Builder Pattern Creational Patterns