抽象工厂模式
一个抽象的接口可以实现多个产品
一个抽象工厂可以实现多个具体工厂
例:一个公司有多个程序猿,有多个产品经理,那么程序猿下面分为Android,iOS,PHP等程序猿,产品经理也分为多个类型。在之前的工厂模式中已经建立了程序猿,这个时候在造一个产品,这个产品其实就是产品经理的角色。
1.建立产品经理的接口
public interface ProductManager {
public void showProductManager();//展示是什么类型的产品经理
}
2.实现具体的产品经理
public class AndroidProductManager implements ProductManager {
@Override
public void showProductManager() {
System.out.println("我是Android产品经理");
}
}
3.建立程序猿种类的接口
public interface CodeMonkey {
public void showCodeMonkeyType();//展示是什么类型的程序猿
}
4.实现具体的程序猿
public class AndroidMonkeyFactory extends Factory {
@Override
public CodeMonkey showCodeMonkeyType() {
return new AndroidCodeMonkey();
}
}
5.建立抽象的工厂来生成产品经理和程序猿
public abstract class AbstractFactory {
public abstract <T extends CodeMonkey>T showCodeMonkeyType(Class<T> clazz) throws Exception;
public abstract <T extends ProductManager>T showProductManager(Class<T> clazz) throws Exception;
}
6.实现具体的工厂管理产品种类的生成
public class AbstractProductManagerFactory extends AbstractFactory {
@Override
public <T extends CodeMonkey> T showCodeMonkeyType(Class<T> clazz) throws Exception {
CodeMonkey codeMonkey= (CodeMonkey) clazz.forName(clazz.getName()).newInstance();
return (T) codeMonkey;
}
@Override
public <T extends ProductManager> T showProductManager(Class<T> clazz) throws Exception {
ProductManager productManager= (ProductManager) clazz.forName(clazz.getName()).newInstance();
return (T) productManager;
}
}
优点:外部只需要关注产品种类,只关注与抽象接口。当业务需求,两个产品有一定的交集依赖关系社即可使用抽象模式解决。
缺点:如果新增一个产品种类,需要修改抽象工厂和工厂的实现代码,违背了开闭原则,不利于维护