抽象工厂模式:
此模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类.
解决什么问题:
抽象工厂模式允许客户在使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品.从而实现客户从具体的产品中解耦.
UML:
  
代码结构:
  
代码:
定义抽象产品:
package com.demo.factory.model;
/**
 * 抽象产品
 */
public abstract class AbstractBaseFood {
    protected String kind;
    protected int num;
    protected float price;
    public float totalPrice() {
        return this.num * this.price;
    }
}
产品接口:
package com.demo.factory.model;
/**
 * 抽象产品接口
 */
public interface IFood {
    void printMessage();
}
抽象具体产品-Beverage类:
package com.demo.factory.model;
/**
 * 抽象具体产品-Beverage
 */
public abstract class Beverage extends AbstractBaseFood implements IFood{
    @Override
    public void printMessage() {
        System.out.println("--" + this.kind + "饮料, \t 单价: " + this.price + ", .\t 数量: " + this.num + ", \t 合计: " + this.totalPrice());
    }
}
抽象具体产品-ChickenWings类:
package com.demo.factory.model;
/**
 * 抽象具体产品-ChickenWings
 */
public abstract class ChickenWings extends AbstractBaseFood implements IFood {
    @Override
    public void printMessage() {
        System.out.println("--" + this.kind + "风味鸡翅, \t 单价: " + this.price + ", .\t 数量: " + this.num + ", \t 合计: " + this.totalPrice());
    }
}
抽象具体产品-FrenchFries类:
package com.demo.factory.model;
/**
 * 抽象具体产品-FrenchFries
 */
public abstract class FrenchFries extends AbstractBaseFood implements IFood {
    @Override
    public void printMessage() {
        System.out.println("--" + this.kind + "风味薯条, \t 单价: " + this.price + ", .\t 数量: " + this.num + ", \t 合计: " + this.totalPrice());
    }
}
抽象具体产品-Hamburg类:
package com.demo.factory.model;
/**
 * 抽象具体产品-Hamburg
 */
public abstract class Hamburg extends AbstractBaseFood implements IFood {
    @Override
    public void printMessage() {
        System.out.println("--" + this.kind + "风味汉堡, \t 单价: " + this.price + ", .\t 数量: " + this.num + ", \t 合计: " + this.totalPrice());
    }
}
具体产品-ChinaBeverage类:
package com.demo.factory.model.kfc;
import com.demo.factory.model.Beverage;
/**
 * 具体产品-ChinaBeverage
 */
public class ChinaBeverage extends Beverage {
    public ChinaBeverage(int num) {
        this.kind = "可乐";
        this.price = 8.0f;
        this.num = num;
    }
}
具体产品-ChinaChickenWings类:
package com.demo.factory.model.kfc;
import com.demo.factory.model.ChickenWings;
/**
 * 具体产品-ChinaChickenWings
 */
public class ChinaChickenWings extends ChickenWings {
    public ChinaChickenWings(int num) {
        this.kind = "奥尔良";
        this.price = 2.5f;
        this.num = num;
    }
}
具体产品-ChinaFrenchFries类:
package com.demo.factory.model.kfc;
import com.demo.factory.model.FrenchFries;
/**
 * 具体产品-ChinaFrenchFries
 */
public class ChinaFrenchFries extends FrenchFries {
    public ChinaFrenchFries(int num) {
        this.kind = "普通";
        this.price = 8.0f;
        this.num = num;
    }
}
具体产品-ChinaHamburg类:
package com.demo.factory.model.kfc;
import com.demo.factory.model.Hamburg;
/**
 * 具体产品-ChinaHumburg
 */
public class ChinaHamburg extends Hamburg {
    public ChinaHamburg(int num) {
        this.kind = "麻辣";
        this.price = 14.0f;
        this.num = num;
    }
}
抽象工厂接口:
package com.demo.factory.itf;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;
/**
 * 抽象工厂接口
 */
public interface IKfcFactory {
    Hamburg createHamburg(int num);
    ChickenWings createChickenWings(int num);
    FrenchFries createFrenchFries(int num);
    Beverage createBeverage(int num);
}
实际工厂:
package com.demo.factory.itf;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;
import com.demo.factory.model.kfc.ChinaBeverage;
import com.demo.factory.model.kfc.ChinaChickenWings;
import com.demo.factory.model.kfc.ChinaFrenchFries;
import com.demo.factory.model.kfc.ChinaHamburg;
/**
 * 实际工厂
 */
public class ChinaKfcFactory implements IKfcFactory {
    @Override
    public Hamburg createHamburg(int num) {
        return new ChinaHamburg(num);
    }
    @Override
    public ChickenWings createChickenWings(int num) {
        return new ChinaChickenWings(num);
    }
    @Override
    public FrenchFries createFrenchFries(int num) {
        return new ChinaFrenchFries(num);
    }
    @Override
    public Beverage createBeverage(int num) {
        return new ChinaBeverage(num);
    }
}
客户类:
package com.demo.factory.custom;
import com.demo.factory.itf.IKfcFactory;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;
/**
 * 客户类
 */
public class Customer {
    private IKfcFactory kfcFactory;
    public Customer(IKfcFactory kfcFactory) {
        this.kfcFactory = kfcFactory;
    }
    public float orderHamburg(int num) {
        Hamburg hamburg = kfcFactory.createHamburg(num);
        hamburg.printMessage();
        return hamburg.totalPrice();
    }
    public float orderChickenWings(int num) {
        ChickenWings chickenWings = kfcFactory.createChickenWings(num);
        chickenWings.printMessage();
        return chickenWings.totalPrice();
    }
    public float orderFrenchFries(int num) {
        FrenchFries frenchFries = kfcFactory.createFrenchFries(num);
        frenchFries.printMessage();
        return frenchFries.totalPrice();
    }
    public float orderBeverage(int num) {
        Beverage beverage = kfcFactory.createBeverage(num);
        beverage.printMessage();
        return beverage.totalPrice();
    }
}
原文:http://www.cnblogs.com/arctique/p/5747117.html