概念
工厂模式是最基本的创建型模式,他有三种形式,简单工厂,工厂方法,抽象工厂
其中最基本的是简单工厂形式,简单工厂形式简单到很多时候不被称为一种模式,更像是一种经验习惯
简单工厂模式借助于工厂类的静态方法,根据参数的不同情况创建不同的对象
ps:包名不应该有大写,应该尽可能地使用一个单词,实在无法避免也不要驼峰命名,全部小写
- package simpleFactory;
- /**
- * Created by noteless on 2018/10/9.
- * Description:
- */
- public interface Fruit {
- String description();
- }
- package simpleFactory;
- /**
- * Created by noteless on 2018/10/9.
- * Description:
- */
- public class Apple implements Fruit {
- @Override
- public String description() {
- return "apple";
- }
- }
- package simpleFactory;
- /**
- * Created by noteless on 2018/10/9.
- * Description:
- */
- public class Orange implements Fruit {
- @Override
- public String description() {
- return "Orange";
- }
- }
- package simpleFactory;
- /**
- * Created by noteless on 2018/10/9.
- * Description:
- */
- public enum FruitType {
- APPLE,
- ORANGE
- }
- package simpleFactory;
- /**
- * Created by noteless on 2018/10/9.
- * Description:
- */
- public class SimpleFruitFactory {
- public static Fruit create(FruitType fruitType){
- if(fruitType.equals(FruitType.APPLE)){
- return new Apple();
- }else if(fruitType.equals(FruitType.ORANGE)){
- return new Orange();
- }
- return null;
- }
- }
测试代码
结构
通过示例可以看得出来,简单工厂模式的确很简单
关键点就是这个静态create方法,内部使用if else结构或者switch结构
由于通常都是静态方法,所以又叫做静态工厂方法模式
模式如下图所示
工厂类根据传入的参数决定创建哪一种类型的具体产品
工厂类Factory
一般就是具体的Java实现类,在客户端程序的请求下直接创建具体的产品,提供静态工厂方法
抽象产品 Product
工厂所创建对象的父类或者公共接口,一般是接口或者抽象类
具体产品 ConcreteProduct
创建的具体的实例对象
特点
简单工厂模式特点:
静态方法、根据参数确定待创建对象的类型
当然,也可以不在一个方法中处理,也可以创建多个方法来创建不同的具体产品对象
而且,如果产品只有一种的话,也可以省略抽象的产品Product角色
简单工厂模式处于产品实例化的核心位置
他知道每个产品,也就是内部直接清楚创建的对象类型
他决定哪一个产品类应该被实例化
允许客户端程序与具体产品的创建过程独立,在系统引入新产品时,不需要修改客户端代码
所以说站在客户端程序的视角看待的话, 算是符合开闭原则
对于简单的场景,简单工厂模式是一个不错的选择,既能够获得工厂型模式的优点
又足够的简便清晰
简单工厂模式根本特点就是一个工厂类包打天下,创建所有的产品
简单工厂模式缺点
既然叫做简单工厂模式,他的优点之一自然是简单
所有的创建逻辑都封装在了一个工厂类中,以不变应万变,所有产品的创建都尽在其中
但是面对复杂的产品体系结构,优点就变成了缺点 ,可能就会过于臃肿复杂不易维护复用
比如,如果新增加了子类,怎么办?
显然需要修改工厂的静态方法
想要扩展功能必须修改工厂类的代码,也就是站在工厂类的角度,不符合开闭原则
而且,面对复杂的产品体系结构,这个工厂类提供所有的创建逻辑
成了一个功能大而全的类,显然这违背了单一职责原则
也会更容易出现问题