严格的说,简单工厂模式并不是23种常用的设计模式之一,它只算工厂模式的一个特殊实现。简单工厂模式在实际中的应用相对于其他2个工厂模式用的还是相对少得多,因为它只适应很多简单的情况。
最重要的是它违背了我们在概述中说的 开放-封闭原则 (虽然可以通过反射的机制来避免,后面我们会介绍到) 。因为每次你要新添加一个功能,都需要在if-else 语句(或者switch-case 语句)中去修改代码,添加分支条件。
适用场景
(1)需要创建的对象较少。
(2)客户端不关心对象的创建过程。
简单工厂模式角色分配:
- 工厂(Factory)角色 :简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
- 抽象产品(Product)角色 :简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
- 具体产品(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();
}
}
我想多增加一种奶茶品种,四季奶青,还需要修改工厂类方法,扩展性差