设计模式——(5)抽象工厂模式

第五章 抽象工厂模式

1.1 简介

抽象工厂模式的定义:抽象工厂模式提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

举例: 工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。

用 OOP 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。

抽象工厂的类图如图所示:
请添加图片描述

1.2 抽象工厂模式——Pizza实例

继第四章通过工厂方法实现Pizza对象的创建,本章继续以Pizza对象创建为例,每种Pizza都需要若干种原料才能创建,每种Pizza需要Clams、Dough、Cheese、Pepperoni、Sauce等不同原料,Pizza是最终产品,每一种原料又有不同类型,所以将不同原料申明为接口,某种风格口味的原料工厂负责生产一系列具体原料,设计方案如图所示。

NYPizzaStore 是客户代码,依赖原料工厂PizzaIngredientFactory生产一系列原料,不同风格口味的原料工厂ChicagoPizzaIngredientFactory和NYPizzaIngredientFactory实现抽象的原料工厂PizzaIngredientFactory,负责实现具体的一族原料。
请添加图片描述

部分代码:

PizzaIngredientFactory类

PizzaIngredientFactory定义了一个接口,用于创建原料家族,并且没有明确指定原料具体的类。

package headfirst.designpatterns.abstractfactory;

public interface PizzaIngredientFactory {
 
	public Dough createDough();
	public Sauce createSauce();
	public Cheese createCheese();
	public Veggies[] createVeggies();
	public Pepperoni createPepperoni();
	public Clams createClam();
 
}

ChicagoPizzaIngredientFactory 类:生产Chicago风味Pizza所需的具体原料。

package headfirst.designpatterns.abstractfactory;

public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {

	public Dough createDough() {
		return new ThickCrustDough();
	}

	public Sauce createSauce() {
		return new PlumTomatoSauce();
	}

	public Cheese createCheese() {
		return new MozzarellaCheese();
	}

	public Veggies[] createVeggies() {
		Veggies veggies[] = { new BlackOlives(), 
		                      new Spinach(), 
		                      new Eggplant() };
		return veggies;
	}

	public Pepperoni createPepperoni() {
		return new SlicedPepperoni();
	}

	public Clams createClam() {
		return new FrozenClams();
	}
}

NYPizzaIngredientFactory类:生产New York风味Pizza所需的具体原料。

package headfirst.designpatterns.abstractfactory;

public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
 
	public Dough createDough() {
		return new ThinCrustDough();
	}
 
	public Sauce createSauce() {
		return new MarinaraSauce();
	}
 
	public Cheese createCheese() {
		return new ReggianoCheese();
	}
 
	public Veggies[] createVeggies() {
		Veggies veggies[] = { new Garlic(), new Onion(), new Mushroom(), new RedPepper() };
		return veggies;
	}
 
	public Pepperoni createPepperoni() {
		return new SlicedPepperoni();
	}

	public Clams createClam() {
		return new FreshClams();
	}
}

1.3 总结

对比工厂方法和抽象工厂

工厂方法:
请添加图片描述
抽象工厂:
请添加图片描述
区别或共同之处

  • 抽象工厂与工厂方法都是负责创建对象,工厂方法是通过对象的组合,工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法,由子类创建对象,抽象工厂提供一个用来创建产品家族的接口,这个接口的子类定义了产品被产生的方法。
  • 工厂方法和抽象工厂都将客户从具体类型中解耦。
  • 抽象工厂创建一系列产品,需要一个很大的接口,而工厂方法创建一个产品,只需要一个方法就可以了。

GitHub地址:https://github.com/SJMP1573/DesignPatterns

参考

[1] Freeman E. Head First 设计模式[M] 中国电力出版社.
[2] 菜鸟教程.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值