一、作用
通过工厂实现对产品类实例的管理。
用户只要关心自己想要什么类型的产品,而产品的创建过程无需关心,全部交给工厂来做。
二、简单/静态工厂模式
1.角色
- 抽象产品
- 具体产品
- 具体工厂
2.使用
- 抽象产品
public abstract class MoonCake {
public abstract void eat();
}
- 具体产品
public class FiveKernalMoonCake extends MoonCake {
@Override
public void eat() {
System.out.println("五仁月饼");
}
}
public class BeanSandMoonCake extends MoonCake {
@Override
public void eat() {
System.out.println("豆沙月饼");
}
}
- 具体工厂
public class MooncakesFactory {
public static Mooncakes makeMooncakes(String type) {
Mooncakes mooncakes = null;
switch (type) {
case "FiveKernel":
mooncakes = new FiveKernel();
break;
case "Beansand":
mooncakes = new Beansand();
break;
}
return mooncakes;
}
}
这个具体工厂类写的扩展性不强。如果需要扩展一个新的产品,需要修改
MooncakesFactroy::makeMoobcakes(),故采用反射对工厂类优化。修改后如下
public static < T extends MoonCake > T makeMoonCake(Class < T > clz) {
MoonCake res = null;
try {
res = (MoonCake) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) res;
}
三、工厂模式
1.角色
- 抽象产品
- 具体产品
- 抽象工厂
- 具体工厂
2.使用
- 抽象产品
同上 - 具体产品
同上 - 抽象工厂
public abstract class MoonCakeFractory2 {
public abstract MoonCake makeCake();
}
- 具体工厂
public class MakeFiveKernalFactory extends MoonCakeFractory2 {
@Override
public MoonCake makeCake() {
return new FiveKernalMoonCake();
}
}
public class MakeBeansandFactory extends MoonCakeFractory2 {
@Override
public MoonCake makeCake() {
return new BeanSandMoonCake();
}
}












网友评论