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

原创 2015年11月19日 11:28:58

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

原创博客,转载请注明出处:
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设计模式之抽象工厂模式

本文属于23种设计模式系列。 继续前面简单工厂模式和工厂方法模式的例子,以汽车配件制造介绍抽象工厂模式。...
  • jason0539
  • jason0539
  • 2015年04月11日 08:26
  • 51719

C++设计模式——抽象工厂模式(含实例)

伟创力(世界500强企业),公司有笔记本生产车间、电视机车间、空调车间、电话生产等车间,各生产车间各行其责,生产出不同类型的产品。伟创力不再是生产单一产品的企业,而是生产出多种不同类型的产品,各产品属...
  • swqqcs
  • swqqcs
  • 2014年09月08日 20:35
  • 1801

设计模式——抽象工厂 Java源代码

抽象工厂 + Java源代码。本程序改编自《Head First Design Patterns》(简称HF )中的关于Pizza的例子...
  • u013390476
  • u013390476
  • 2015年12月24日 20:06
  • 1664

C++设计模式——抽象工厂模式(含实例)

伟创力(世界500强企业),公司有笔记本生产车间、电视机车间、空调车间、电话生产等车间,各生产车间各行其责,生产出不同类型的产品。伟创力不再是生产单一产品的企业,而是生产出多种不同类型的产品,各产品属...
  • swqqcs
  • swqqcs
  • 2014年09月08日 20:35
  • 1801

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

抽象工厂模式
  • tsgx_1989
  • tsgx_1989
  • 2015年04月02日 15:12
  • 204

Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)

一、抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类。优...
  • my98800
  • my98800
  • 2017年01月15日 10:44
  • 108

Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)

Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)一、抽象工厂模式简介(Bref Introduction)抽象工厂模式(Abstract Factory Patte...
  • jimtom
  • jimtom
  • 2011年05月19日 13:44
  • 167

设计模式-抽象工厂模式(讲解及其实现代码)

  • 2016年06月23日 18:31
  • 445KB
  • 下载

设计模式-抽象工厂模式javademo

  • 2014年05月13日 17:18
  • 44KB
  • 下载

Java23种设计模式06抽象工厂模式.pdf

  • 2013年06月03日 15:06
  • 658KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式实例学习-抽象工厂模式
举报原因:
原因补充:

(最多只允许输入30个字)