目录
1.什么是抽象工厂模式
是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。解决工厂方法模式无法处理多产品问题。
2.优缺点
优点:
- 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
- 当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
- 抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则
缺点:
新增产品种类工厂都需要更新,系统更难理解。
3.适用场景
系统的产品有多于一个的产品族,而系统只消费其中某一族的产品
4.工厂模式的角色
产品组1,参考简单工厂模式
新增产品组2:
抽象产品;
public interface School {
/**
* 输出学校名称
*/
void outName();
}
具体产品:
public class QhSchool implements School {
@Override
public void outName() {
System.out.println("清华");
}
}
public class BdSchool implements School {
@Override
public void outName() {
System.out.println("北大");
}
}
抽象工厂: 可确认职业和学校
public abstract class AbstractFactory {
/**
* 获取职业信息
*
* @param type 职业 type
* @return 职业
*/
public abstract Profession getProfession(int type);
/**
* 获取学信息
*
* @param type 学校 type
* @return 学校
*/
public abstract School getSchool(int type);
}
具体工厂:
public class ProfessionFactory extends AbstractFactory {
@Override
public Profession getProfession(int type) {
Profession profession = null;
switch (type) {
case 1:
profession = new Tester();
break;
case 2:
profession = new Developer();
break;
}
return profession;
}
@Override
public School getSchool(int type) {
return null;
}
}
public class SchoolFactory extends AbstractFactory {
@Override
public Profession getProfession(int type) {
return null;
}
@Override
public School getSchool(int type) {
School school = null;
switch (type) {
case 1:
school = new QhSchool();
break;
case 2:
school = new BdSchool();
break;
}
return school;
}
}
抽象工厂测试
public class AbstractFactoryMain {
public static void main(String[] args) {
SchoolFactory schoolFactory = new SchoolFactory();
schoolFactory.getSchool(1).outName();
schoolFactory.getSchool(2).outName();
ProfessionFactory professionFactory = new ProfessionFactory();
professionFactory.getProfession(1).outDesc();
professionFactory.getProfession(2).outDesc();
}
}
更多详细扩展代码:
gitlhub项目地址:https://github.com/foralllove/my-utils