在 面向对象设计的几个原则:
- 单一原则:就一个类而言,应该仅有一个引起它变化的原因,单个类处理单个 功能。不要把过多的功能模块堆砌到单一的类中,那样会导致后期维护麻烦,缺乏灵活性。
- 开放——封闭原则:在设计时类、模块、函数等应该是可以扩展,但是不能修改 将各个模块独立化,尽可能的去扩展功能而不改变原有的功能,在软件的需求发生改变时,系统可以保持相对的稳定。
- 迪米特法则(LoD):最少知识原则,在类的机构设计上,每一个类都应当尽量降低成员的访问权限,根本思想是强调类之间的松耦合。我们在程序设计时,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。
上一章设计模式(一)——工厂模式、策略模式中学习了两种设计模式,但是不管是工厂模式还是策略模式都有两个很明显的问题,都需要switch来选择当前使用的具体实现子类,并且当程序需要扩展时需要修改时,需要创建对应功能子类并且修改的工厂创建方法或者策略选择方法增加switch选项,很明显和开放——封闭原则相违背了。
工厂方法模式
BaseFactory factory = new StudentFactory();
var stu=factory.CreateUser();
stu.SetMessage("YY", 18, 0);
factory.ShowUserInfo();
BaseFactory factory_tech = new TeacherFactory();
var stechtu = factory_tech.CreateUser();
stechtu.SetMessage("YL", 35, 0);
factory_tech.ShowUserInfo();
上图是以简单的学校的人员信息管理类结构图,以工厂方法模式来实现。对比之前学习的简单工厂模式,简单工厂模式最大的优点在于工厂类中包含的必要的逻辑判断,根据用户的选择条件动态的实例化相关的类。而工厂方法模式实现是,工厂方法把简单工厂的内部逻辑判断转移到了客户端。当需要大量的动态创建不同的职业类型的“用户”时,工厂方法模式会比简单工厂更实用。但是这里都没有规避的掉必要的逻辑判断。所以就还需要进一步提升——抽象工厂模式
抽象工厂模式
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需要指定它们具体的类。
借用菜鸟教程示例绘制类结构设计图
public class ShapeFactory : AbstractFactory
{
public Shape GetShape(string type)
{
Shape result = (Shape)Assembly.Load("NetLearning").CreateInstance("NetLearning." + type);
return result;
}
public Color GetColor(string color)
{
throw new System.NotImplementedException();
}
}
public class ColorFactory : AbstractFactory
{
public Color GetColor(string color)
{
Color result=(Color)Assembly.Load("NetLearning").CreateInstance("NetLearning."+color);
return result;
}
public Shape GetShape(string type)
{
throw new System.NotImplementedException();
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
AbstractFactory factory = FactoryProducer.GetFactory("shape");
var circle = factory.GetShape("Circle");
circle.Draw();
AbstractFactory colorFactoty = FactoryProducer.GetFactory("color");
var red = colorFactoty .GetColor("Red");
red.Fill();
}
}
结合程序反射功能,可以减少一些看起来繁琐的判断语句,在大型的项目中,也可更好的实现扩展。