简单工厂模式
定义:专门负责创建其他实例的一个类。简单工厂模式属于创建型模式,根据需求创建不同类。顾名思义,简单工厂,真是非常简单。
通常简单工厂模式包括三个角色:
- Creator : 工厂类,实例化对象的核心类,按照逻辑创建实例。
- Product : 抽象产品类,所有具体产品类的父类,可以是接口或者抽象类,主要定义抽象类型。
- Concrete Product :具体产品类,具体实例对象。
比如奶茶店有卖珍珠奶茶、抹茶奶茶、奶盖奶茶等,这里奶茶店就是工厂类,具体产品类各是珍珠奶茶、抹茶奶茶、奶盖奶茶,奶茶就是它们的抽象产品类。
代码示例
抽象产品类
public abstract class MilkTea {...}
具体产品类
public class PearlMilkTea extends MilkTea{...}//珍珠奶茶
public class MatchalMilkTea extends MilkTea{...}//抹茶奶茶
public class MilkCapMilkTea extends MilkTea{...}//奶盖奶茶
工厂类
public class MilkTeaCreator {
public MilkTea getMilkTea(String type) {//根据名字获取实例
MilkTea milkTea = null;
if (type.equals("珍珠奶茶")) {
milkTea = new PearlMilkTea();
} else if (type.equals("抹茶奶茶")) {
milkTea = new MatchalMilkTea();
} else if (type.equals("奶盖奶茶")) {
milkTea = new MilkCapMilkTea();
}
return milkTea;
}
}
客户端
MilkTeaCreator creator = new MilkTeaCreator();
PearlMilkTea pearlMilkTea = (PearlMilkTea) creator.getMilkTea("珍珠奶茶");
MatchalMilkTea matchalMilkTea = (MatchalMilkTea) creator.getMilkTea("抹茶奶茶");
MilkCapMilkTea milkCapMilkTea = (MilkCapMilkTea) creator.getMilkTea("奶盖奶茶");
可以看出创建实例的任务交给了Creator,让其决定如何创建实例,这样的好处是分离客户端对产品实例的耦合,哪天加入柠檬奶茶就可以在Creator里加多判断,灵活很多。
其实上边介绍的是静态简单工厂,还有一种会更灵活,利用反射机制动态创建实例。
动态简单工厂
只要将工厂类改造一下,但是参数改为具体类型的包名。
public MilkTea getMilkTea(String cn) {
MilkTea milkTea = null;
try {
Class<?> cls = Class.forName(cn);
milkTea = (MilkTea) cls.newInstance();
} catch (ClassNotFoundException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
return milkTea;
}
客户端
PearlMilkTea pearlMilkTea = (PearlMilkTea) creator.getMilkTea("PearlMilkTea");
MatchalMilkTea matchalMilkTea = (MatchalMilkTea) creator.getMilkTea("MatchalMilkTea");
MilkCapMilkTea milkCapMilkTea = (MilkCapMilkTea) creator.getMilkTea("MilkCapMilkTea");
动态工厂通常获取xml文件相应对象的包名,创建实例,非常灵活。
总述,简单工厂模式是真的非常简单,只要记住它是负责专门创建实例的一个类。不足之处望指教。