学习抽象工厂模式首先要了解什么是产品族和产品等级这两个概念,所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族,抽象工厂模式所提供的一系列产品就组成一个产品族,而产品等级的概念,其实就是一个具体产品,简单的来区分产品族和产品等级,就是产品族是抽象的,而产品等级是具体的。
举个很简单的例子,苹果iPhone手机和三星Galaxy手机,是同一个产品等级,它们都是手机,是具体的产品;而苹果公司除了生产iPhone以外,还有iPad平板电脑,这样,iPhone和iPad就组成了一个产品族,都是一个苹果公司这个工厂来生产,而三星也生产平板电脑Galaxy Note,这样Galaxy和Galaxy Note组成一个产品族,都是由三星这个工厂生产。
实现源码如下:
package org.lee.study.abstractfactory;
public interface Factory {
public Mobile genMobile();
public Pad genPad();
public Notebook genNotebook();
}
package org.lee.study.abstractfactory;
public class IphoneFactory implements Factory {
public Mobile genMobile() {
return new Iphone();
}
public Pad genPad() {
return new Ipad();
}
public Notebook genNotebook() {
return new MacBook();
}
}
package org.lee.study.abstractfactory;
public class SunsungFactory implements Factory {
@Override
public Mobile genMobile() {
return new Galaxy();
}
@Override
public Pad genPad() {
return new GalaxyNote();
}
@Override
public Notebook genNotebook() {
return new SunsungNoteBook();
}
}
package org.lee.study.abstractfactory;
public interface Mobile {
/**
* 手机呼叫功能
*/
public void call();
}
package org.lee.study.abstractfactory;
public interface Pad {
/**
* 平板电脑的触摸屏功能
*/
public void touch();
}
package org.lee.study.abstractfactory;
public interface Notebook {
/**
* 利用笔记本工作
*/
public void work();
}
package org.lee.study.abstractfactory;
public class Galaxy implements Mobile {
@Override
public void call() {
System.out.println("我用三星Galaxy系列的手机给你打电话!");
}
}
package org.lee.study.abstractfactory;
public class GalaxyNote implements Pad {
@Override
public void touch() {
System.out.println("三星Galaxy Note平板电脑。");
}
}
package org.lee.study.abstractfactory;
public class SunsungNoteBook implements Notebook {
@Override
public void work() {
System.out.println("用三星笔记本办公!");
}
}
package org.lee.study.abstractfactory;
public class Ipad implements Pad {
@Override
public void touch() {
System.out.println("HOHO~~~,我有Ipad Air了。");
}
}
package org.lee.study.abstractfactory;
public class Iphone implements Mobile {
@Override
public void call() {
System.out.println("我用iPhone给你打电话!");
}
}
package org.lee.study.abstractfactory;
public class MacBook implements Notebook {
@Override
public void work() {
System.out.println("用苹果笔记本办公!");
}
}
package org.lee.study.abstractfactory;
public class Client {
public static void main(String[] args) {
Factory factory = new IphoneFactory();
/* 苹果产品族 */
Iphone iphone = (Iphone) factory.genMobile();
iphone.call();
MacBook mac = (MacBook) factory.genNotebook();
mac.work();
Ipad ipad = (Ipad) factory.genPad();
ipad.touch();
factory = new SunsungFactory();
/* 三星产品族 */
Galaxy galaxy = (Galaxy) factory.genMobile();
galaxy.call();
SunsungNoteBook sun = (SunsungNoteBook) factory.genNotebook();
sun.work();
GalaxyNote note = (GalaxyNote) factory.genPad();
note.touch();
}
}
抽象工厂模式的学习,关键还是要理解产品族与产品等级的关系,不然的话很容易与工厂方法弄混淆。当然这只是我个人的见解,每个人的学习方法、理解方式不一样,所以学习起来理解的程序也不一致。