5抽象工厂模式
图片来自head first 设计模式,仅供学习之用
抽象工厂的每个方法实际上看起来都像是工厂方法,每个方法负责产生一类产品。所以抽象工厂和工厂方法最大的不同是抽象工厂可以产生很多类产品,是一个产品的集合。抽象工厂模式实现也是通过子类实现,即实现每一个工厂方法。
事实上,理解了工厂方法模式,抽象工厂模式很容易理解,就是工厂方法模式的一个推广。
自己想了个例子,感觉不是很恰当= =,贴一下代码
从以下的代码也可以看出,抽象工厂的优势在于可以定制不同的具体工厂来生产,缺点是一组产品,缺点是这组产品发生改变的时候,修改难度大。
例如可以轻松的添加一个“实验班生”具体工厂,但是仍然只能准备课本和文具。
package com.company; import java.util.ArrayList; //方便输出 abstract class Thing{ protected String name; public String getName(){ return name; } } //抽象产品 abstract class TextBook extends Thing{ final private String categ="这是课本"; public void show(){ System.out.println(categ+" "+getName()); } } //抽象产品 abstract class Stationary extends Thing{ final private String categ="这是文具"; void show(){ System.out.println(categ+" "+getName()); } } class MathBook extends TextBook{ public MathBook(){ name="MathBook"; } } class EnglishBook extends TextBook{ public EnglishBook(){ name="EnglishBook"; } } class PoliticsBook extends TextBook{ public PoliticsBook(){ name="PoliticsBook"; } } class Pen extends Stationary{ public Pen(){ name="Pen"; } } class Eraser extends Stationary{ public Eraser(){ name="Eraser"; } } class Calculator extends Stationary{ public Calculator(){ name="Calculator"; } } class Computer extends Stationary{ public Computer(){ name="Computer"; } } //这是抽象工厂 interface PrepareToSchool{ TextBook PrepareTextBook(); Stationary PrepareStationary(); } //具体工厂 理科生 class Li_ke_sheng implements PrepareToSchool{ @Override public TextBook PrepareTextBook() { return new MathBook(); } @Override public Stationary PrepareStationary() { return new Calculator(); } } //具体工厂 文科生 class Wen_ke_sheng implements PrepareToSchool{ @Override public TextBook PrepareTextBook() { return new PoliticsBook(); } @Override public Stationary PrepareStationary() { return new Pen(); } } class Student{ private String name; private ArrayList pacage; PrepareToSchool prepareToSchool; public Student(String name,PrepareToSchool prepareToSchool){ this.name=name; pacage=new ArrayList(); this.prepareToSchool=prepareToSchool; } void Prepare(){ pacage.add(prepareToSchool.PrepareStationary()); pacage.add(prepareToSchool.PrepareTextBook()); } void show(){ System.out.println(name); System.out.println(pacage.size()); for (int i = 0; i <pacage.size() ; i++) { Thing thing =(Thing) pacage.get(i); System.out.println(thing.getName()); } } }