本文介绍的是设计模式的一种——简单工厂模式
简单工厂模式简介
简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。
它是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
在简单工厂模式中,可以根据参数的不同返回不同类的实例。
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式结构图
简单工厂模式简单实现
主要角色
工厂:负责实现创建所有实例的内部逻辑,并提供一个外界调用的方法,创建所需的产品对象。
抽象产品:负责描述产品的公共接口
具体产品:描述生产的具体产品。
举个简单易懂的例子:
“假设”有一台炒菜机(工厂),可以做出各种不同的菜品(抽象产品),有三个按钮(参数)对应这三种菜品(具体产品)。
工厂:负责实现创建所有实例的内部逻辑,并提供一个外界调用的方法,创建所需的产品对象。
抽象产品:负责描述产品的公共接口
具体产品:描述生产的具体产品。
举个简单易懂的例子:
“假设”有一台炒菜机(工厂),可以做出各种不同的菜品(抽象产品),有三个按钮(参数)对应这三种菜品(具体产品)。
这时候你可以根据点击按钮来选择你喜欢的菜品。
步骤 1
创建抽象产品类
我们创建一个抽象产品类,他有一个抽象方法用于启动做菜:
package 软件工程作业; public abstract class Product { /** * 产品的抽象方法,由具体的产品类去实现 */ public abstract void start(); }
步骤2
创建具体菜品类
接着我们创建各个不同的菜A、B、C,他们都继承了他们的父类Product ,并实现了父类的start方法:
package 软件工程作业; public class Aproduct extends Product{ @Override public void start() { System.out.println("开始做菜A"); } }
package 软件工程作业; public class Bproduct extends Product{ @Override public void start() { System.out.println("开始做菜B"); } }
package 软件工程作业; public class Cproduct extends Product{ @Override public void start() { System.out.println("开始做菜C"); } }package 软件工程作业;
步骤 3
接下来创建一个工厂类,它提供了一个静态方法cookProduct用来做菜。你只需要传入你想做的菜名,它就会实例化相应品牌的菜对象:
package 软件工程作业; public class Factory { public static Product cookProduct(String type){ Product m=null; switch (type) { case "A": m=new Aproduct(); break; case "B": m=new Bproduct(); break; case "C": m=new Cproduct(); break; } return m; } }
步骤4
客户端调用工厂类,传入“A”生产出菜A并调用该菜的start方法:
package 软件工程作业; public class Cookproduct { public static void main(String[]args){ Factory.cookProduct("A").start(); } }
终端输出结果:
优点:
- 符合开-闭原则:新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可
- 符合单一职责原则:每个具体工厂类只负责创建对应的产品
缺点:
- 增加了系统的复杂度:类的个数将成对增加
- 增加了系统的抽象性和理解难度
- 一个具体工厂只能创建一种具体产品
在以下情况下可以使用简单工厂模式:
- 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
- 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。
解释其中用到的多态机制:
通过写一个抽象类里面有一个抽象方法,别的类继承抽象类,重写抽象类中的抽象方法实现了一种多态。
说明模块抽象封装的方法:
利用抽象类实现。
分析各个模块的内聚度和模块之间的耦合度:
每个不同类实现不同的抽象方法,需要什么类什么方法就加上什么类什么方法,提高了模块的内聚度,降低了模块之间的耦合度。实现了“开放-封闭”原则,这样模块更加清晰,每个部分都各司其职,分工明确,可维护性更好。