课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
工厂设计模式是大多数软件开发程序员都会学习与应用的一种软件设计模式,而本文我们就通过案例分析来简单了解一下,工厂设计模式都有哪些类型。
1、软件设计的复杂性
软件的本质是人类通过指令指导机器来处理人类世界的事务,因而人类世界的复杂性必然会反映到软件上。
高中物理告诉我们,运动是绝对的,静止是相对的。正是事物的运动(动态性)造成了复杂性——用更容易听得懂的话讲叫“未来的不确定性”。需求总是无休止地改变,没有哪个软件是一成不变的。
运动的自然结果是熵增——就好像你家客厅总是越来越乱一样,随着时间的推移,软件系统不可避免地逐渐趋向混乱:随着旧逻辑的变动和新逻辑的增加(以及既有bug的“修复”),系统逻辑越来越复杂且难以理解,bug越来越多,修改功能越来越困难。
人们一个直观但错误的认知是:通过修复bug能逐渐减少系统的bug,终将bug归零——除非该系统自发布后不用做任何迭代,否则无论你键盘敲多快都赶不上bug的增长速度(这一点在上层业务系统中表现得尤为明显)。
程序员们应对软件系统熵增的手段主要是重构和使用设计模式。
重构是在未来对系统进行重新构建,以消除或减少系统的混乱,其依据是人们在未来会比过去对系统/业务有更加深刻的认知,另一方面过去的设计已经达到其承载变化能力的极限——实践中重构(特别是大规模的)往往发生在系统崩溃边缘。
设计模式是在现在对系统进行预构建,以应对未来的复杂性(变化)。所谓设计模式,就是根据过往经验,将系统设计中共通的东西抽取出来,加以标准化(形成模式),以追求系统设计上的相对静止性(稳定性),以不变应对未来的变化(不确定性)。
设计模式解决复杂性的主要手段是抽象和隔离。
2、三种工厂
任何设计模式都是用来解决软件设计的复杂性问题,追求设计上的稳定性。工厂模式属于创建者模式之一(其它的创建者模式如单例、原型、建造者模式),用来解决对象创建的复杂性。
什么样的对象创建具有复杂性?
只需要一句new以及传几个简单参数的基本不存在创建复杂性,也就用不上工厂模式;
对象创建具有多态性:如需要根据配置创建不同的子类型对象,创建代码中有多个ifelse的;
对象创建过程比较复杂:虽然不需要创建不同的子类对象,但对象创建本身较复杂,必须需要读取配置文件、获取远程数据等;
在进一步讨论之前,我们先简单提下工厂模式的三种形式:简单工厂、工厂方法和抽象工厂(和GoF的划分有点不一样)。
简单工厂:在目标类中创建一个静态方法用于创建目标类对象,或者进一步,将该静态方法抽离成一个单独的工厂类;
工厂方法:对简单工厂的升级。定义一个工厂接口,利用多态,每个工厂实现类返回目标类/接口的一种特定子类实例。工厂方法解决了简单工厂可能过于复杂的问题,使得工厂本身更符合开闭原则和单一职责原则;
抽象工厂:对工厂方法的升级。它是用来解决目标实例本身的多维复杂性,防止工厂类随着目标类数量一起爆炸增长。工厂方法是一个工厂类只负责创建一种目标实例,而抽象工厂是一个工厂可以创建多种目标实例。
单听理论有点懵,大致只需要知道从工厂自身的复杂性以及用来解决问题的复杂性来说,简单工厂<工厂方法<抽象工厂(前者是后者的特例,后者是前者的升级)——注意,这里提到了两个复杂性(工厂自身复杂性和它需要解决的问题复杂性),这也预示着使用工厂的原则:尽可能使用简单工具解决问题,除非问题真的很复杂,简单工具不好解决。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。