来源:mikechen的互联网架构
简单工厂模式 (Factory Pattern) 是 Java 中最常用的设计模式之一 。
简单工厂模式实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类责,适用于工厂类责创建的对象比较少等场景中。
本文将采用图解、源码方式,全面详解简单工厂模式。通过本文,我们可以了解并掌握以下知识:

简单工厂模式(Simple Factory),又被称为静态工厂方法模式,属于创建型设计模式,是由一个工厂对象决定创建出哪一种产品类的实例。
简单工厂模式的 3 个重要构成分别是工厂类、抽象产品、具体产品。

工厂类:负责实现创建所有实例的内部逻辑。
抽象产品:所创建的所有对象的父类,负责描述所有实例所共有的公共接口。
具体产品:创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
下面,我们通过一个场景例子、并提供相应的源码,来帮助理解剖析简单模式的具体实现。

假设:
某手机生产厂商,原来为小米代工生产手机 。
随着业务的拓展,这个手机生产厂商还要生产华为手机、苹果手机。
此时,就需要使用一个单独的类来专门生产手机,这里就会用到简单工厂方式。
mikechen的互联网架构
我们来看下,用简单工厂模式是怎样实现的。
1) 创建抽象产品类,定义具体产品的公共接口。
首先,我们创建一个手机的抽象产品类,通过抽象方法来启动手机。
package com.mikechen.java.design.factory.simple;public abstract class Phone {/*** 产品的抽象方法,由具体的产品类去实现*/public abstract void start();}
2)创建具体产品类,继承抽象产品类,定义生产的具体产品。
接着,我们创建各个品牌的手机,它们都继承了其父类 Phone ,并实现了父类的 start 方法:
小米手机:
package com.mikechen.java.design.factory.simple;public class XiaomiPhone extends Phone{public void start() {System.out.println("小米手机启动");}
华为手机:
package com.mikechen.java.design.factory.simple;public class HuaWei Phone extends Phone{@Overridepublic void start() {System.out.println("华为手机启动");}
苹果手机:
package com.mikechen.java.design.factory.simple;public class IPhone extends Phone{public void start() {System.out.println("苹果手机启动");}
3)创建工厂类,通过创建静态方法,根据传入不同参数、创建不同具体产品类的实例。
工厂类提供了一个静态方法 createPhone 用来生产手机。
只需要传入工厂想要生产的手机品牌,就会实例化相应品牌的手机对象:
package com.mikechen.java.design.factory.simple;public class PhoneFactory {public static Phone createPhone(String type){Phone mPhone=null;switch (type) {case "HuaWei":mPhone=new HuaWeiPhone();break;case "xiaomi":mPhone=new xiaomiPhone();break;}return mPhone;}}
客户端调用工厂类,传入“HuaWei”生产出华为手机,并调用该手机对象的 start 方法:
package com.mikechen.java.design.factory.simple;public class CreatPhone {public static void main(String[]args){PhoneFactory.createPhone ("HuaWei").start();}}
这里我做了简化,真实环境中,可以根据传入的具体产品参数,来实现具体的产品。
简单工厂模式的优点:
将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
把初始化实例时的工作放到工厂里进行,使代码更容易维护。
简单工厂模式的缺点:
工厂类集中了所有实例(产品) 的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
违背“开放-关闭原则”,一旦添加新产品,就需要修改工厂类的逻辑,将导致工厂逻辑过于复杂;
简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。

客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时;
客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数;
当工厂类负责创建的对象具体产品比较少时,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
通过本文,我们了解并掌握了简单工厂模式。
简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责。缺点是工厂类不够灵活,增加新的具体产品时,需要修改工厂类的判断逻辑代码,当产品越来越多,工厂方法的代码就会非常复杂。