工厂模式分为 简单工厂模式,工厂方法模式 和抽象工厂方法模式。
抽象工厂模式用于为访问类提供一个创建一组相关或互相依赖对象的接口,并且访问类无须指定所要产品的具体类就能够得到同族的不同等级的产品的模式结构。
首先我们创建一个 net.haicoder.factory.absFactory
包,在该包下面创建 AbstractFactory.java
接口,AbstractColor.java
、BlueColor.java
、 RedColor.java
、
AbstractProduct.java
、 BusProduct.java
、 CarProduct.java
、BlueBusFactory.java
、RedCarFactory.java
和 TestMain.java
文件。文件创建完毕,目录结构如下图:
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();
}
}
程序运行后,控制台输入如下信息:
设计模式中抽象工厂模式是对工厂方法模式的抽象,工厂方法模式是针对一个商品进行创建,而抽象工厂模式是将具有共性的商品进行组装,然后生产出一个商品。
在使用抽象工厂的时候,建议从下往上设计,先考虑好具体的商品有哪些,然后进行抽象,组装。