Java设计模式之工厂方法模式(Factory Method)

 

概念

        工厂方法模式在很多书籍中被区分为简单工厂和工厂方法2种,也确有微小差别,不过,我比较倾向于将其归类为1种。

        在创建类时,通常可以同时定义多个构造函数,然后让它们返回创建类的实例。然而有时候,
客户代码虽然需要某个对象,却并不关心或者不需要关心这个对象究竟是由哪个类创建而来的。

        所以,工厂方法模式的意图,就是定义一个用于创建对象的接口,并控制返回哪个类的实例,使得客户代码无须关心使用哪个类的实例。

        如何区分工厂方法?
        你可能认为任何可以创建或返回一个新对象的方法都是工厂方法。然而,在面向对象的编程中,方法返回新对象是非常普遍的,并非每个这样的方法都应用方法工厂方法模式。工厂方法模式不仅要求有一个能创建新对象的方法,还要让客户代码无须了解具体实例化的类。

 

缺点

1,违反了系统设计的开闭原则,什么是开闭原则?开闭原则是要求一个系统的设计能够允许系统在无需修改的情况下,扩展其功能。而工厂方法模式,在创建新对象时,需要再次修改工厂类,才能达到目的。《java与模式》一书中,还提到有人把这种类称之为”上帝类(God Class)”,它就是万物的中心。

2,逻辑集中到一个工厂类,不同的产品类有不同的特性,工厂类需要判断在什么时候创建,创建具体哪个产品实例,判断逻辑混合在一起,使得系统在将来进行功能扩展是较为困难。

3,工厂方法模式使用静态方法作为工厂方法,而静态方法无法由子类继承,因此,工厂角色无法形成基于继承的等级结构。

 

代码演示

        华为和苹果手机都是手机,但是它们的有很多的特性都是不同的,比如系统。我们就用这个例子来演示工厂方法模式。

 

创建手机接口类

 

创建华为手机类,并实现手机接口

 

创建苹果手机类,并实现手机接口

 

创建工厂类,控制2个手机的实例

 

main方法验证

 

输出:

华为手机:安卓系统
苹果手机:ios系统

参考书籍:

《java与模式》
《设计模式之禅》
《Java设计模式(第2版)中文版》


guolin

guolin

相信世界,向往美好,记录成长过程,分享个人心得,充实平凡生活。 网站信条:因为喜欢,所以热爱。

发表评论

电子邮件地址不会被公开。 必填项已用*标注