抽象工厂模式

文章来源:软件秘籍----设计模式那点事


抽象工厂模式(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());
		
	}
}


4.饮料基类——Beverage

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)通过组合的方式使用工厂时。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值