文章来源:软件秘籍----设计模式那点事
抽象工厂模式(Abstract Factory Pattern)提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类。
抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新的产品。
这样一来,客户就从具体产品中解耦。
实例:
肯德基店——生产食物的工厂
食物(汉堡、鸡翅、薯条、可乐)——工厂生产的产品
爸爸、儿子——客户
抽象食物
1.抽象食物——AbstractBaseFood
package com.demo.factory.custom.model;
/**
* 食物基类
* @author Administrator
*
*/
public abstract class AbstractBaseFood {
//类别
protected String kind;
//数量
protected int num;
//价格
protected float price;
//合计
public float totalPrice()
{
return this.num*this.price;
}
}
2.食物接口——IFood
package com.demo.factory.custom.model;
/**
* 抽象食物接口
* @author Administrator
*
*/
public interface Ifood {
/*
* 打印输出食物信息
*/
void printMessage();
}
1.汉堡基类——Hamburg
package com.demo.factory.custom.model;
/**
*汉堡基类
*/
public abstract class Hamburg extends AbstractBaseFood implements Ifood{
public void printMessage()
{
System.out.println("=="+this.kind+"风味汉堡,\t单价:"+this.price+",\t数量:"+this.num+",\t合计:"+this.totalPrice());
}
}
2.鸡翅基类——ChickenWings
package com.demo.factory.custom.model;
/**
*鸡翅基类
*/
public abstract class ChickenWings extends AbstractBaseFood implements Ifood{
public void printMessage()
{
System.out.println("=="+this.kind+"风味鸡翅,\t单价:"+this.price+",\t数量:"+this.num+",\t合计:"+this.totalPrice());
}
}
3.薯条基类——FrenchFries
package com.demo.factory.custom.model;
/**
*薯条基类
*/
public abstract class FrenchFries extends AbstractBaseFood implements Ifood{
public void printMessage()
{
System.out.println("=="+this.kind+"风味薯条,\t单价:"+this.price+",\t数量:"+this.num+",\t合计:"+this.totalPrice());
}
}
package com.demo.factory.custom.model;
/**
*饮料基类
*/
public abstract class Beverage extends AbstractBaseFood implements Ifood{
public void printMessage()
{
System.out.println("=="+this.kind+"饮料,\t单价:"+this.price+",\t数量:"+this.num+",\t合计:"+this.totalPrice());
}
}
创建具体的食物
1.麻辣鸡翅汉堡——ChinaHanburg
package com.demo.factory.custom.model.kfc;
import com.demo.factory.custom.model.Hamburg;
/**
* 中国风味的麻辣鸡腿汉堡
* @author Administrator
*
*/
public class ChinaHanburm extends Hamburg{
/**
* 构造方法
*/
public ChinaHanburm(int num)
{
this.kind="麻辣";
this.price=14.0f;
this.num=num;
}
}
2.奥尔良烤翅——ChinaChickenWings
package com.demo.factory.custom.model.kfc;
import com.demo.factory.custom.model.ChickenWings;
/**
* 鸡翅实现类
* @author Administrator
*
*/
public class ChinaChickenWings extends ChickenWings{
/**
* 构造方法
*/
public ChinaChickenWings(int num)
{
this.kind="奥尔良";
this.price=2.5f;
this.num=num;
}
}
3.薯条——ChinaFrenchFries
package com.demo.factory.custom.model.kfc;
import com.demo.factory.custom.model.FrenchFries;
/**
* 薯条实现类
* @author Administrator
*
*/
public class ChinaFrenchFrice extends FrenchFries{
/**
* 构造方法
*/
public ChinaFrenchFrice(int num)
{
this.kind="普通";
this.price=8.0f;
this.num=num;
}
}
4.可乐——ChinaBeverage
package com.demo.factory.custom.model.kfc;
import com.demo.factory.custom.model.Beverage;
/**
* 饮料实现类
* @author Administrator
*
*/
public class ChinaBeverage extends Beverage{
/**
* 构造方法
*/
public ChinaBeverage(int num)
{
this.kind="可乐";
this.price=7.0f;
this.num=num;
}
}
建立工厂
1.创建抽象肯德基工厂——IKfcFactory生产抽象食物
package com.demo.factory.itf;
import com.demo.factory.custom.model.Beverage;
import com.demo.factory.custom.model.ChickenWings;
import com.demo.factory.custom.model.FrenchFries;
import com.demo.factory.custom.model.Hamburg;
/**
* 肯德基抽象工厂
* @author Administrator
*
*/
public interface IKfcFactory {
//生产汉堡
public Hamburg createHamburg(int num);
//生产薯条
public FrenchFries createFrenchFries(int num);
//生产鸡翅
public ChickenWings createChickenWings(int num);
//生产饮料
public Beverage createBeverage(int num);
}
2.创建具体肯德基工厂——ChinaKfcFactory生产具体食物
package com.demo.factory.itf;
import com.demo.factory.custom.model.Beverage;
import com.demo.factory.custom.model.ChickenWings;
import com.demo.factory.custom.model.FrenchFries;
import com.demo.factory.custom.model.Hamburg;
import com.demo.factory.custom.model.kfc.ChinaBeverage;
import com.demo.factory.custom.model.kfc.ChinaChickenWings;
import com.demo.factory.custom.model.kfc.ChinaFrenchFrice;
import com.demo.factory.custom.model.kfc.ChinaHanburm;
/**
* 具体工厂
* @author Administrator
*
*/
public class ChinaKfcFactory implements IKfcFactory{
//生产汉堡
@Override
public Hamburg createHamburg(int num) {
// TODO Auto-generated method stub
return new ChinaHanburm(num);
}
//生产薯条
@Override
public FrenchFries createFrenchFries(int num) {
// TODO Auto-generated method stub
return new ChinaFrenchFrice(num);
}
//生产鸡翅
@Override
public ChickenWings createChickenWings(int num) {
// TODO Auto-generated method stub
return new ChinaChickenWings(num);
}
//生产饮料
@Override
public Beverage createBeverage(int num) {
// TODO Auto-generated method stub
return new ChinaBeverage(num);
}
}
创建客户类
package com.demo.factory.custom;
import com.demo.factory.custom.model.Beverage;
import com.demo.factory.custom.model.ChickenWings;
import com.demo.factory.custom.model.FrenchFries;
import com.demo.factory.custom.model.Hamburg;
import com.demo.factory.custom.model.kfc.ChinaChickenWings;
import com.demo.factory.itf.IKfcFactory;
/**
* 客户类
* @author Administrator
*
*/
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();
}
}
爸爸、儿子点单
package com.demo.factory;
import com.demo.factory.custom.Customer;
import com.demo.factory.itf.ChinaKfcFactory;
import com.demo.factory.itf.IKfcFactory;
public class MainApp {
public static void main(String[] args) {
/**
* 定义一个肯德基类型
*/
IKfcFactory kfcFactory = new ChinaKfcFactory();
/**
* 爸爸和儿子准备点餐
*/
Customer customer = new Customer(kfcFactory);
/**
* 开始点餐
*
*/
//一个麻辣鸡腿汉堡
float hamburgMoney = customer.orderHamburg(1);
//四个奥尔良烤翅
float chickenWingsMoney = customer.orderChickenWings(4);
//一包薯条
float frenchFriesMoney = customer.orderFrenchFries(1);
//两杯可乐
float berverageMoney = customer.orderBeverage(2);
System.out.println("总计:"+(hamburgMoney+chickenWingsMoney+frenchFriesMoney+berverageMoney));
}
}
(1)工厂方法模式通过继承的方式实现应用程序的解耦,而抽象工厂模式则通过对象组合的方式实现应用程序的解耦。
(2)工厂方法模式用来创建一个抽象产品,具体工厂实现工厂方法来创建具体产品,而抽象工厂模式用来创建一个产品家族的抽象类型。
抽象工厂模式的使用场合
(1)创建产品家族,相关产品集合在一起使用的时候
(2)想要提供一个产品类库,并只想显示器接口而不是实现
(3)通过组合的方式使用工厂时。