Java常用设计模式--三种工厂模式之简单工厂模式(Simple Factory)

2020-08-13 11:36:57 浏览数 (1)

严格的说,简单工厂模式并不是23种常用的设计模式之一,它只算工厂模式的一个特殊实现。简单工厂模式在实际中的应用相对于其他2个工厂模式用的还是相对少得多,因为它只适应很多简单的情况。

最重要的是它违背了我们在概述中说的 开放-封闭原则 (虽然可以通过反射的机制来避免,后面我们会介绍到) 。因为每次你要新添加一个功能,都需要在if-else 语句(或者switch-case 语句)中去修改代码,添加分支条件。

适用场景

(1)需要创建的对象较少。

(2)客户端不关心对象的创建过程。

简单工厂模式角色分配:

  1. 工厂(Factory)角色 :简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
  2. 抽象产品(Product)角色 :简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
  3. 具体产品(Concrete Product)角色:简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

举个例子:

奶茶店有各种奶茶,奶茶类别有波霸奶茶、红豆奶茶、 珍珠奶茶等

奶茶店-->工厂(Factory)角色

奶茶-->抽象产品(Product)角色

波霸奶茶、红豆奶茶、 珍珠奶茶-->具体产品(Concrete Product)角色

例子代码:

代码语言:javascript复制
package com.example.simplefactory;

public interface MilkyTea {

    /**
     * 制造奶茶
     */
    void makeMilkyTea();

}
代码语言:javascript复制
package com.example.simplefactory;

/**
 * 红豆奶茶
 */
public class OrmosiaMilkyTea implements MilkyTea {

    @Override
    public void makeMilkyTea() {
        System.out.println("制作红豆奶茶");
    }
}
代码语言:javascript复制
package com.example.simplefactory;

public class BoBaMilkyTeam implements MilkyTea {
    @Override
    public void makeMilkyTea() {
        System.out.println("制作波霸奶茶");
    }
}
代码语言:javascript复制
package com.example.simplefactory;

public class PearlMilkyTea implements MilkyTea {
    @Override
    public void makeMilkyTea() {
        System.out.println("制作珍珠奶茶");
    }
}
代码语言:javascript复制
package com.example.simplefactory;

public class SimpleFactory {

    public static final int TYPE_BB = 1;//波霸奶茶
    public static final int TYPE_HD = 2;//红豆奶茶
    public static final int TYPE_ZZ = 3;//珍珠奶茶

    public static MilkyTea createMilkyTea(int type) {
        MilkyTea milkyTea = null;
        if(type == TYPE_BB){
            milkyTea = new BoBaMilkyTeam();
        }else if(type == TYPE_HD){
            milkyTea = new OrmosiaMilkyTea();
        }else if(type == TYPE_ZZ){
            milkyTea = new PearlMilkyTea();
        }
        return milkyTea;
    }

}
代码语言:javascript复制
package com.example.simplefactory;

public class Test {

    public static void main(String[] args) {
        MilkyTea milkyTea = SimpleFactory.createMilkyTea(1);
        milkyTea.makeMilkyTea();
    }

}

我想多增加一种奶茶品种,四季奶青,还需要修改工厂类方法,扩展性差

0 人点赞