简介
抽象工厂:抽象产品,具体产品,抽象工厂,具体工厂。
但是抽象工厂多出了产品族,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。
产品族:个人理解就是同一类产品,而抽象工厂能生产多类产品。
类图
代码
/** * 抽象工厂-产品族-抽象产品 * 圆形 * @author: 张彬 * @date: 2018年3月22日 下午2:44:27 * @version: V1.0 * @review: 张彬/2018年3月22日 下午2:44:27 */ public interface Circle { public void draw(); }
/** * 抽象工厂-产品族-具体产品 * 绿圆形 * @author: 张彬 * @date: 2018年3月22日 下午3:07:48 * @version: V1.0 * @review: 张彬/2018年3月22日 下午3:07:48 */ public class GreenCircle implements Circle { @Override public void draw() { System.out.println("in GreenCircle::draw() method."); } }
/** * 抽象工厂-产品族-具体产品 * 红圆形 * @author: 张彬 * @date: 2018年3月22日 下午3:07:48 * @version: V1.0 * @review: 张彬/2018年3月22日 下午3:07:48 */ public class RedCircle implements Circle { @Override public void draw() { System.out.println("in RedCircle::draw() method."); } }
/** * 抽象工厂-产品族-抽象产品 * 矩形 * @author: 张彬 * @date: 2018年3月22日 下午2:44:27 * @version: V1.0 * @review: 张彬/2018年3月22日 下午2:44:27 */ public interface Rectangle { public void draw(); }
/** * 抽象工厂-产品族-具体产品 * 绿矩形 * @author: 张彬 * @date: 2018年3月22日 下午2:46:10 * @version: V1.0 * @review: 张彬/2018年3月22日 下午2:46:10 */ public class GreenRectangle implements Rectangle { @Override public void draw() { System.out.println("in GreenRectangle::draw() method."); } }
/** * 抽象工厂-产品族-具体产品 * 红矩形 * @author: 张彬 * @date: 2018年3月22日 下午2:46:10 * @version: V1.0 * @review: 张彬/2018年3月22日 下午2:46:10 */ public class RedRectangle implements Rectangle { @Override public void draw() { System.out.println("in RedRectangle::draw() method."); } }
/** * 抽象工厂-抽象工厂 * @author: 张彬 * @date: 2018年3月22日 下午4:05:24 * @version: V1.0 * @review: 张彬/2018年3月22日 下午4:05:24 */ public interface AbstractFactory { Circle getCircle(); Rectangle getRectangle(); }
/** * 抽象工厂-具体工厂 * 生产红色图形 * @author: 张彬 * @date: 2018年3月22日 下午3:15:59 * @version: V1.0 * @review: 张彬/2018年3月22日 下午3:15:59 */ public class RedShapeFactory implements AbstractFactory{ @Override public RedCircle getCircle() { return new RedCircle(); } @Override public RedRectangle getRectangle() { return new RedRectangle(); } }
/** * 抽象工厂-具体工厂 * 生产绿色图形 * @author: 张彬 * @date: 2018年3月22日 下午3:15:59 * @version: V1.0 * @review: 张彬/2018年3月22日 下午3:15:59 */ public class GreenShapeFactory implements AbstractFactory{ @Override public GreenCircle getCircle() { return new GreenCircle(); } @Override public GreenRectangle getRectangle() { return new GreenRectangle(); } }
/** * 客户端-测试 * @author: 张彬 * @date: 2018年3月22日 下午3:04:34 * @version: V1.0 * @review: 张彬/2018年3月22日 下午3:04:34 */ public class AbstractFactoryDemo { public static void main(String[] args) { AbstractFactory greenShapeFactory = new GreenShapeFactory(); greenShapeFactory.getCircle().draw();; greenShapeFactory.getRectangle().draw(); AbstractFactory redShapeFactory = new RedShapeFactory(); redShapeFactory.getCircle().draw();; redShapeFactory.getRectangle().draw(); } }
输出结果:
in GreenCircle::draw() method. in GreenRectangle::draw() method. in RedCircle::draw() method. in RedRectangle::draw() method.
工厂模式总结。
工厂模式的好处就在于将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面。- 简单工厂模式,相当于是一个工厂中有各种产品,创建在一个类中,客户无需知道具体产品的名称,只需要知道产品类所对应的参数即可。但是工厂的职责过重,而且当类型过多时不利于系统的扩展维护。如果增加一个产品,要修改工厂类,不符合开闭原则。
- 工厂方法模式,相当于在简单工厂模式的基础上增加一个抽象工厂,如果增加一个产品,只需要增加具体工厂和具体产品即可。对一种产品的等级模式,生成某一种基类下的对象。
- 抽象工厂模式,可应对多种产品等级模式,引入产品族,类似于一个集团旗下生产的各种产品的工厂,这些产品是一个产品族。是在工厂方法下的扩展,可生成多种基类下的对象。