如果说工厂方式模式只是提供单一产品创建接口,那抽象工厂就是让工厂抽象类拥有创建更多产品的能力,一个汽车生产线包括车架,底盘,轮毂等。抽象工厂的好处便于交换产品系列。如常见的数据库访问类。
interface IFactory{
IUser CreateUser();
IDepartment CreateDepartment();
}
class SqlServerFactory : IFactory
{
public IUser CreateUser()
{
return new SqlserverUser();
}
public IDepartment CreateDepartment()
{
return new SqlserverDepartment();
}
}
class AccessFactory : IFactory
{
public IUser CreateUser()
{
return new AccessUser();
}
public IDepartment CreateDepartment()
{
return new AccessDepartment();
}
}
如果只是替换产品线比较容易,要是新增一个数据库访问表就要修改IFactory,SqlServerFactory ,AccessFactory。 这里可以用简单工厂改进。虽然简单工厂会多一些switch或if判断,但可以通过反射配置去掉。
4、builder建造者
又叫生成器模式,将一个复杂产品的生成过程和它的表示分离,这样给不同的表示就可以创建出不同的产品,就像去买咖啡,加不加糖,加几块,加不加奶,做出来就是不同的咖啡,用户只需要指定我要冰美式就行。
有多个产品Builder构建类生成不同的产品,用户Director指挥者指定一种产品就可以通过GetResult获取这款产品。这个比较好理解,产品创建过程内部完整高内聚,只对外暴露产品需求,需要什么产品,内部创建后给客户。
5、Prototype原型原型模式用于创建重复的对象而不需要知道创建的细节。一般在初始化的信息不发生变化时,克隆Copy可以动态的获取一个运行时的对象,而且效率相比构造函数会提高。原型模式克隆对象应该是由于类型自己完成的。
在dotNET中提供了一个ICloneable接口(代替原型抽象类Prototype的功能)。只需要实现这个接口就可以完成原型模式。
class MyClass : ICloneable{
public object Clone()
{
return this.MemberwiseClone();
}
}
注意:MemberwiseClone是浅拷贝,就是对于引用类型只复制了引用,而没有真的把引用类型堆地址复制一份,值类型倒没问题是真的内存上复制一份。所以这样如果生成一个拷贝类,则修改拷贝类中的引用类型,原类也会跟着变动。因此使用深拷贝老老实实在Clone方法里调用重载构造函数(直到没有引用类型成员)初始化拷贝类,然后将值类型变量赋值。
结构型结构型设计模式关注的是对象与对象之间的关系,像拼积木,组合合并给程序提供更好的灵活和扩展
1、Adapter 适配器联想到电源的适配器,各个国家的电压不一样,为了满足电器使用电压就需要适配器转换成额定电压,那么适配器模式的定义就是将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。那么如何转换呢,核心就是适配器继承或依赖已有的对象,实现想要的目标接口。