其实简单工厂模式严格意义上来讲不属于常说的 GoF 23 种设计模式之一,不过可能用的比较多,又经常被拿来跟「工厂方法模式」、「抽象工厂模式」拿来对比,所以属于基础要求,必须掌握的。他们都属于类创建型设计模式,从模式命名模式上来简略分析,其实就是设计了一个工厂,里面管理者各种具体的类的构造初始化,然后客户端直接想要调用哪个类直接告诉工厂即可。
定义:
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式。
老四对于简单工厂模式的理解总结起来就是一句话,接口的行为抽象。举个例子并用代码展示一下。比如我们现在定义一个鸟类,鸟类都会飞行,那我们就可以将飞行的方法抽象出来,然后信鸽、老鹰、知更鸟可以实现鸟类的行为,最后通过工厂类进行具体鸟类的初始化供客户端调用即可。
代码示例
首先声明一个抽象类或者接口,抽象公共行为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.glorze.gof.simple.factory.self; /** * 抽象接口类: 鸟类 * * @ClassName: Bird * @author: 高老四博客 * @since: 2020/4/23 17:43 */ public interface Bird { /** * 鸟类的飞行行为 * @Title: fly * @return void */ void fly(); } |
三个实现类,实现抽象封装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.glorze.gof.simple.factory.self; /** * 具体鸟类: 老鹰类 * * @ClassName: Eagle * @author: 高老四博客 * @since: 2020/4/23 17:45 */ public class Eagle implements Bird { public Eagle() { System.out.println("创建一只老鹰!"); } @Override public void fly() { System.out.println("我要去运动达人罗志祥家啄米,起飞!"); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.glorze.gof.simple.factory.self; /** * 具体鸟类: 信鸽类 * * @ClassName: Letter * @author: 高老四博客 * @since: 2020/4/23 17:45 */ public class Letter implements Bird { public Letter() { System.out.println("创建一只信鸽!"); } @Override public void fly() { System.out.println("我要送一封信,起飞!"); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.glorze.gof.simple.factory.self; /** * 具体鸟类: 知更鸟类 * * @ClassName: Robin * @author: 高老四博客 * @since: 2020/4/23 17:45 */ public class Robin implements Bird { public Robin() { System.out.println("创建一只知更鸟!"); } @Override public void fly() { System.out.println("有人要杀死一只知更鸟,起飞!"); } } |
创建工厂类,声明静态方法,负责具体实现类的实例化操作。最后进行客户端调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package com.glorze.gof.simple.factory.self; /** * 鸟类工厂类,负责各个具体鸟类的初始化、实例化操作 * * @ClassName: BirdFactory * @author: 高老四博客 * @since: 2020/4/23 17:57 */ public class BirdFactory { public static Bird getBird(String birdType) { Bird bird = null; if (birdType.equals("letter")) { bird = new Letter(); System.out.println("信鸽初始化完毕,等待起飞!"); } else if (birdType.equals("eagle")) { bird = new Eagle(); System.out.println("老鹰初始化完毕,等待起飞!"); } else if (birdType.equals("letter")) { bird = new Letter(); System.out.println("信鸽初始化完毕,等待起飞!"); } return bird; } public static void main(String[] args) { Bird bird = BirdFactory.getBird("eagle"); bird.fly(); } } |
运行结果
通过简单工厂模式的代码示例,我们可以清晰的看到,客户端的调用与具体的实现类相分隔,关于具体的鸟类实现都统一封装在工厂类中,由其负责各种业务的操作,客户端无需关心,只需要负责传入自己想要获得鸟类对象对应的类型参数即可,这样就比较遵循「单一职责」的规约。同时,再具体的业务中,客户端传入的「birdType」可以通过配置文件等实现动态传参从而满足「开放-封闭」原则。
不过,我们从工厂类中依然可以看到,静态方法依然承接了各种各样的情景判断,这也是他的缺点,所谓的职责过重,而且如果具体的实现类比较多,判断条件也会增多,同时增加一个具体实现类也要修改这个静态方法,这些也都是简单工厂模式的局限性。
所以简单工厂模式适用于工厂类负责创建的对象数目较少,业务逻辑相对简单的业务场景。
相关阅读
更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击「给你买杜蕾斯」),也可扫描小站放的支付宝领红包二维码,线下支付享受优惠的同时老四也可以获得对应赏金,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。