您的位置:首页 > 编程语言 > Java开发

设计模式实例学习-抽象工厂模式

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()方法就可以生成这个学生对象。

抽象工厂模式的优缺点

优点

封装性,产品类的具体实现细节无需关心,只需要知道其对应的工厂方法即可。

可以在工厂中对产品实现进行约束或修改。

缺点

拓展性弱,每次增加产品族则需要修改抽象类,增加一个生产新产品族的方法,违反了开放封闭的原则。(横向拓展容易,纵向拓展难。指增加产品族难,违反了开放封闭原则,增加产品等级容易,只需要增加一个新等级的工厂类就可以。)

使用场景

一个对象族有相同的约束,则可以使用抽象工厂模式。类似于不同操作系统下对应的相同软件产品的情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息