本文主要是介绍【设计模式】——工厂家族,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
工厂家族共包含三种设计模式,分别为简单工厂模式、抽象工厂模式、工厂方法模式,这三种设计模式都做到了抽象和继承,却又不是完全面向对象,因为每一种都有自己的局限性。工厂家族中有最简单的都不符合开闭原则的,也有复杂的完成更重要功能的,下面就来看看具体介绍:
简单工厂模式
简单工厂模式可以说是所有设计模式中最简单的,它仅仅只是简简单单的做到了继承,即将几个相似类中的相同部分提取出来,放到一个父类中去,然后让这些类去继承父类。然后创建一个简单工厂类,让它创建运算实例。
结构图(以运算器为例)
简单工厂模式虽然做到了继承,但是却违背了开放封闭原则,就拿上图来说,如果要增加一种算法,那么就得加一个类去继承运算类,这是对扩展开放的;但是新加的算法需要体现在简单工厂类中,即修改了简单工厂类,对修改也开放了。如果算法很多,那么简单工厂类中的case分支就会特别多,这样的代码不好维护,而且还容易遗忘。
工厂方法模式
工厂方法模式:定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。也就是说,在子类中去实例化对象,让子类做到需要什么就实例化什么。
结构图(同样以运算器为例)
两种模式的区别就是工厂方法模式将原来的工厂类变成了一个抽象工厂的接口,然后让各种工厂类去继承,这样的话,就可以将逻辑判断的代码从工厂类中去除,被放到了客户端。如果要加一种算法的话,直接增加具体运算类和具体工厂类就行了,但是这样的话还有一个缺点,那就是增加算法后,虽然不用再改工厂类中的case分支了,但是得去改客户端的代码。这样的话,还是没有解决选择判断的问题。
抽象工厂模式
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
结构图(同样以运算器为例)
在抽象工厂模式下,增加一个算法,只需增加具体工厂类和具体运算类,和工厂方法模式一样,增加之后还是需要更改客户端的逻辑判断代码。
小结
简单工厂模式不符合开闭原则,这是面向对象的一大忌讳;工厂方法模式虽然避免了这一缺点,但是却不是完全避免,另外它也有自己的缺点,那就是灵活性不够,所以在不同的要求下也会向其他设计模式转换;抽象工厂模式既符合开闭原则也符合依赖倒转原则,但是抽象工厂模式中的类的耦合还是存在的,所以也需要简单工厂模式或者其他模式、反射等来协助工作。
总结
这三种设计模式可以说是一步一步改善的,逐渐的克服前一个的缺点。他们三个也是各有千秋,有自己的优势,也有自己的劣势。并没有哪一个设计模式是最完美的,只有哪一个最适合,不该用的地方用上了反而成了累赘。
这篇关于【设计模式】——工厂家族的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!