简单工厂模式,可理解为一个创建对象的类,但之前的认识为以较少信息构建复杂对象的模式,如以某汽车型号配套相关的具体零部件,或某型号电脑对应一系列配置信息创建出的实例,具体该如何理解可逐步明确。但整体理解应为将对象实例化过程进行封装为原则,在开发团队中如父类开发者避免子类或调用者与该类代码发生耦合的情况,避免这种耦合很有必要,某些类型甚至模块发生互相调用与高度耦合的情况将非常不利于维护,且异常的处理与控制难度极高。
优点:1.工厂模式隔离了调用者对实例的依赖,调用者不再负责创建实例,将创建实例的工作交给工厂类,责任被分摊,现在能想到的就是多人开发过程的应用;
2.代码的复用,创建实例的具体过程交给工厂类实现,实例工厂的创建过程可被所有调用者共用。(同时也是缺点,一旦工厂运行不良实例就出不来)
缺点:1.工厂集合了所有实例的创建,一旦出现问题调用工厂的位置都将失效;
2.扩展困难,一旦需要添加新的类型就要修改工厂创建逻辑,且工厂内部重复代码可能较多。
应用场景:1.对象种类较少时适用;2.调用者只需要知道型号,对创建过程不关心时。
工厂方法模式,与简单工厂区别就是添加新产品时事实上就是增加抽象工厂与与抽象产品的实现,即针对每个对象创建一个专属工厂,需添加新的产品时则盖一个新的工厂,这时工厂与产品成为一个平行的等级结构。
这样简化了工厂内的创建逻辑,但代码冗余较高。
抽象工厂模式,定义工厂抽象类与产品抽象类,扩展较容易,但工厂与产品行为较难扩展,较适合标准化配件与设备,如工作中使用到的虚拟示波器。
以下代码可理解为抽象工厂模式的实现
class Factory { public void Test() { Vehicle drive = GetVehicle("巡检"); drive.Run(); Vehicle drive1 = GetVehicle("定位"); drive1.Run(); } private Vehicle GetVehicle(string vehiclename) { Vehicle result = null; switch (vehiclename) { case "巡检": result = new Car(); break; case "定位": result = new Bike(); break; default: result = null; //for (int i = 0; i < 10; i++) //{ //} break; } return result; } } internal abstract class Vehicle { internal abstract void Run(); } internal class Car : Vehicle { internal override void Run() { MessageBox.Show("巡检模式"); } } internal class Bike : Vehicle { internal override void Run() { MessageBox.Show("定位模式"); } }