设计模式实例学习-抽象工厂模式
2015-11-19 11:28
666 查看
设计模式实例学习-抽象工厂模式
原创博客,转载请注明出处:http://blog.csdn.net/u011035622/article/details/49925217
定义
(对象创建型)概念定义
为创建一组相关或互相依赖的对象提供一个接口,而且无须指定他们的具体类。 我的理解,这个模式和工厂方法模式有相似之处,区别点在于他们针对的产品对象。对于工厂方法,工厂只有一个比较合适,然后通过知道类名去实例化同类的产品。对于抽象工厂,工厂数目可以有多个,通过知道生产产品所对应的工厂,就能够实例化对象。抽象工厂比较适合于有多种产品等级类型的情况。
角色职责
抽象产品类具体A产品类
具体B产品类
抽象工厂
具体1等级工厂
具体2等级工厂
实例分析
场景描述
现在有两批专业的学生,分别是英语专业和数学专业,两个专业班级分班都是分为A班和B班,就这一情况生成不同专业及班级对应的学生对象。
代码实现及讲解
抽象产品类Student.java
public abstract class Student { public void mySchool(){ System.out.println("From XXXX Uni."); } public abstract void myClass(); public abstract void myMajor(); }
这里可以通过一个抽象EnglishStudent、MathStudent类来抽取他们共同的部分(myMajor()方法),但为了便于阐述理解,这里就不这样做了。
具体A产品类
EnglishAStudent.java
public class EnglishAStudent extends Student { @Override public void myClass() { System.out.println("From Class A."); } @Override public void myMajor() { System.out.println("English."); } }
具体B产品类
EnglishBStudent.java
public class EnglishBStudent extends Student{ @Override public void myClass() { System.out.println("From Class B."); } @Override public void myMajor() { System.out.println("English."); } }
抽象工厂
College.java
public abstract class College { //生产A班和B班的学生 public abstract Student createAStudent(); public abstract Student createBStudent(); }
具体1等级工厂
CollegeEnglish.java:英语专业学院
public class CollegeEnglish extends College{ @Override public Student createAStudent() { return new EnglishAStudent(); } @Override public Student createBStudent() { return new EnglishBStudent(); } }
具体2等级工厂
CollegeMath.java:数学专业学院
public class CollegeMath extends College{ @Override public Student createAStudent() { return new MathAStudent(); } @Override public Student createBStudent() { return new MathBStudent(); } }
场景类
package abstractFactory; public class Main { public static void main(String[] args) { College collegeEngl = new CollegeEnglish(); College collegeMath = new CollegeMath(); Student englA = collegeEngl.createAStudent(); Student englB = collegeEngl.createAStudent(); Student mathA = collegeMath.createAStudent(); Student mathB = collegeMath.createAStudent(); englA.myClass(); englA.myMajor(); englB.myClass(); englB.myMajor(); mathA.myClass(); mathA.myMajor(); mathB.myClass(); mathB.myMajor(); } }
输出:
From Class A. English. From Class A. English. From Class B. Math. From Class B. Math.
对于任意一个产品,我们只需要知道他的工厂方法就能够生产这个产品对象。在DEMO中,我们需要一个英语专业A班的学生,我们并不需要知道这个具体实现对象的类名及实现,我们只需要知道他对应的工厂CollegeEnglish及他的createAStudent()方法就可以生成这个学生对象。
抽象工厂模式的优缺点
优点
封装性,产品类的具体实现细节无需关心,只需要知道其对应的工厂方法即可。可以在工厂中对产品实现进行约束或修改。
缺点
拓展性弱,每次增加产品族则需要修改抽象类,增加一个生产新产品族的方法,违反了开放封闭的原则。(横向拓展容易,纵向拓展难。指增加产品族难,违反了开放封闭原则,增加产品等级容易,只需要增加一个新等级的工厂类就可以。)使用场景
一个对象族有相同的约束,则可以使用抽象工厂模式。类似于不同操作系统下对应的相同软件产品的情况。相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树