抽象工厂
抽象工厂模式(Abstract Factory Pattern)是一种属于超级工厂模式去衍生其他的工厂。
介绍
目的:超级工厂去创建其他从抽象工厂衍生出的工厂。
实例:一个工厂中有许多的分产品,其之间会有一些共同点。就可以分成不同的车间去专门加工这一系列的产品。
缺点:基于抽象工厂来生成新的工厂对象,每添加一个产品族的话,需要建立对应的工厂、新的产品功能和实现类,会使项目文件和修改内容更繁琐。
实现
一个严格的快餐店是不单单要卖汉堡包的,还需要薯条、鸡翅和可乐。但他们都有个共同特点可以使你变重,还有变得更快乐。你点的时候可以单点,也可以来个套餐。
UML图例
具体实现
抽象工厂
KfcFactory:
public abstract class KfcFactory {
public abstract Hamburg getHamburg(String order);
public abstract Fries getFries(String order);
public abstract Meal getMeal(String order1, String order2);
}
Fries:
public interface Fries {
void shape();
}
CycleFries:
public class CycleFries implements Fries {
@Override
public void shape() {
System.out.println("I'm cycle");
}
}
StraightFries:
public class StraightFries implements Fries {
@Override
public void shape() {
System.out.println("I'm straight");
}
}
FactoryProducer:
public class FactoryProducer {
private static FactoryProducer instance;
private static Map<String, KfcFactory> map = new HashMap<>();
static {
instance = new FactoryProducer();
map.put("MealFactory", new MealFactory());
map.put("FriesFactory", new FriesFactory());
map.put("HamburgFactory", new HamburgFactory());
}
public static FactoryProducer getInstance() {
return instance;
}
public KfcFactory getFactory(String type) {
return map.get(type);
}
}
Meal:
public class Meal {
Hamburg hamburg;
Fries fries;
Meal(String order1, String order2) {
KfcFactory hamburgFactory = FactoryProducer.getInstance().getFactory("HamburgFactory");
KfcFactory friesFactory = FactoryProducer.getInstance().getFactory("FriesFactory");
this.hamburg = hamburgFactory.getHamburg(order1);
this.fries = friesFactory.getFries(order2);
}
public void getHappy() {
System.out.println("Its a meal");
if(null != hamburg) {
hamburg.taste();
}
if(null != fries) {
fries.shape();
}
}
}
MealFactory:
public class MealFactory extends KfcFactory {
@Override
public Hamburg getHamburg(String order) {
return null;
}
@Override
public Fries getFries(String order) {
return null;
}
@Override
public Meal getMeal(String order1, String order2) {
return new Meal(order1, order2);
}
}
FactoryDemo:
public class FactoryDemo {
public static void main(String[] args) {
KfcFactory hamburgFactory = FactoryProducer.getInstance().getFactory("HamburgFactory");
KfcFactory friesFactory = FactoryProducer.getInstance().getFactory("FriesFactory");
KfcFactory mealFactory = FactoryProducer.getInstance().getFactory("MealFactory");
Hamburg hamburg = hamburgFactory.getHamburg("BeefHamburg");
hamburg.taste();
Fries fries = friesFactory.getFries("CycleFries");
fries.shape();
Meal meal = mealFactory.getMeal("BeefHamburg", "CycleFries");
meal.getHappy();
}
}
Output
Taste like beef
I’m cycle
Its a meal
Taste like beef
I’m cycle
本文仅供学习记录之用,如有错误欢迎指正。