前面介绍的工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。
同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。
本节要介绍的抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族,图 1 所示的是海尔工厂和 TCL 工厂所生产的电视机与空调对应的关系图。

- 定义
是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
- 优点
1 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
2 当增加一个新的产品族时不需要修改原代码,满足开闭原则。
- 缺点
1 当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。
类图

/***
* 产品类接口
*/
public interface IVideo {
public void getVideoName();
}
public class JavaVideo implements IVideo {
@Override
public void getVideoName() {
System.out.println("java video");
}
}
public class VueVideo implements IVideo {
@Override
public void getVideoName() {
System.out.println("vue video");
}
}
/***
* 产品类接口 源码课程
*/
public interface ISourceCode {
public void getSourceCodeName();
}
public class JavaSourceCode implements ISourceCode {
@Override
public void getSourceCodeName() {
System.out.println("java SourceCod");
}
}
public class VueSourceCode implements ISourceCode {
@Override
public void getSourceCodeName() {
System.out.println("vue SourceCod");
}
}
/***
* 工厂接口 课程 包含视频课程与源码课程
*/
public interface ICourseFactory {
public IVideo getVideo();
public ISourceCode getSourceCode();
}
public class JavaCourseFactory implements ICourseFactory {
@Override
public IVideo getVideo() {
return new JavaVideo();
}
@Override
public ISourceCode getSourceCode() {
return new JavaSourceCode();
}
}
public class VueCourseFactory implements ICourseFactory {
@Override
public IVideo getVideo() {
return new VueVideo();
}
@Override
public ISourceCode getSourceCode() {
return new VueSourceCode();
}
}
网友评论