抽象工厂模式实现

抽象工厂模式实现教程

工厂模式分为 简单工厂模式工厂方法模式抽象工厂方法模式

抽象工厂模式详解

定义

抽象工厂模式用于为访问类提供一个创建一组相关或互相依赖对象的接口,并且访问类无须指定所要产品的具体类就能够得到同族的不同等级的产品的模式结构。

实现步骤

  1. 理清出有多少个产品。
  2. 分别创建各个产品的抽象类,并且用具体产品来实现抽象类里面的方法。
  3. 定义抽象工厂用来组装各个产品。
  4. 定义抽象工厂的实现类,来具体操作产品的组装。

图解

13 抽象工厂图解.png

抽象工厂模式优缺点

优点

  • 让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操作实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
  • 增加新的族很方便,无须修改已有系统,符合开闭原则。

缺点

  • 当产品族中需要增加一个新的产品时候,所有的工厂类都需要进行修改。

案例

Java实现抽象工厂模式

首先我们创建一个 net.haicoder.factory.absFactory 包,在该包下面创建 AbstractFactory.java 接口,AbstractColor.javaBlueColor.javaRedColor.java

AbstractProduct.javaBusProduct.javaCarProduct.javaBlueBusFactory.javaRedCarFactory.javaTestMain.java 文件。文件创建完毕,目录结构如下图:

14 抽象工厂方法代码结构图.png

AbstractColor.java 代码如下:

package net.haicoder.factory.absFactory.color; public abstract class AbstractColor { abstract AbstractColor getColor(); }

BlueColor.java 代码如下:

package net.haicoder.factory.absFactory.color; public class BlueColor extends AbstractColor { public BlueColor() { System.out.println("I am Blue"); } AbstractColor getColor() { return new BlueColor(); } }

RedColor.java 代码如下:

package net.haicoder.factory.absFactory.color; public class RedColor extends AbstractColor { public RedColor() { System.out.println("I am red"); } AbstractColor getColor() { return new RedColor(); } }

AbstractProduct.java 代码如下:

package net.haicoder.factory.absFactory.product; /** * 定义一个抽象的产品 */ public abstract class AbstractProduct { abstract AbstractProduct getProduct(); }

BusProduct.java 代码如下:

package net.haicoder.factory.absFactory.product; public class BusProduct extends AbstractProduct { public BusProduct() { System.out.println("生产一个公共汽车"); } AbstractProduct getProduct() { return new BusProduct(); } }

CarProduct.java 代码如下:

package net.haicoder.factory.absFactory.product; public class CarProduct extends AbstractProduct { public CarProduct() { System.out.println("生产一个小汽车"); } AbstractProduct getProduct() { return new CarProduct(); } }

AbstractFactory.java 代码如下:

package net.haicoder.factory.absFactory; import net.haicoder.factory.absFactory.color.AbstractColor; import net.haicoder.factory.absFactory.product.AbstractProduct; /** * 定义一个工厂类,生产指定颜色的指定产品 */ public interface AbstractFactory { AbstractProduct createProduct(); AbstractColor createColor(); }

BlueBusFactory.java 代码如下:

package net.haicoder.factory.absFactory; import net.haicoder.factory.absFactory.color.AbstractColor; import net.haicoder.factory.absFactory.color.BlueColor; import net.haicoder.factory.absFactory.product.AbstractProduct; import net.haicoder.factory.absFactory.product.BusProduct; public class BlueBusFactory implements AbstractFactory { public AbstractProduct createProduct() { return new BusProduct(); } public AbstractColor createColor() { return new BlueColor(); } }

RedCarFactory.java 代码如下:

package net.haicoder.factory.absFactory; import net.haicoder.factory.absFactory.color.AbstractColor; import net.haicoder.factory.absFactory.color.RedColor; import net.haicoder.factory.absFactory.product.AbstractProduct; import net.haicoder.factory.absFactory.product.CarProduct; /** * 具体的红色的汽车工厂 */ public class RedCarFactory implements AbstractFactory { public AbstractProduct createProduct() { return new CarProduct(); } public AbstractColor createColor() { return new RedColor(); } }

TestMain.java 代码如下:

package net.haicoder.factory.absFactory; public class TestMain { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); AbstractFactory abstractFactory = new RedCarFactory(); abstractFactory.createColor(); abstractFactory.createProduct(); } }

程序运行后,控制台输入如下信息:

15 抽象工厂方法代码运行结果图.png

抽象工厂模式总结

设计模式中抽象工厂模式是对工厂方法模式的抽象,工厂方法模式是针对一个商品进行创建,而抽象工厂模式是将具有共性的商品进行组装,然后生产出一个商品。

在使用抽象工厂的时候,建议从下往上设计,先考虑好具体的商品有哪些,然后进行抽象,组装。