Abstract Factory(抽象工厂)

Abstract Factory(抽象工厂) 创建型 对象 1

Intent_意图2

提供一个接口,用于创建相关或依赖对象的家庭,而不需要明确指定具体类

Motivation_动机3

Applicability_适用性4

1.一个系统要独立于它的产品的创建、组合和表示时。
2.一个系统要由多个产品系列中的一个来配置时。
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4.当你提供一个产品类库,而只想显示它们的接口而不是实现时。

Structure_结构5

Abstract Factory(抽象工厂)_第1张图片

Participants_参与者6

  • AbstractFactory(抽象工厂) 声明一个创建抽象产品对象的操作接口
  • ConcreteFactory(具体工厂) 实现创建具体产品对象的操作
  • AbstractProduct(抽象产品) 为一类产品对象声明一个接口
  • ConcreteProduct(具体产品) 定义一个将被相应的具体工厂创建的产品对象
  • Client(客户) 仅使用AbstractFactory和AbstractProduct类声明的接口

Collaborations_协作7

AbstractFactory定义一个接口,这个接口包含一组方法用来生产产品
  -> ConcreteFactory必须实现这个接口
Client的代码只涉及到AbstractFactory,运行时自动使用ConcreteFactory,每个ConcreteFactory都能生产一个整组的产品

Comsequences_结果8

  • 优点
    将客户从具体的产品创建中解耦
    通过对象的组合来创建对象
    将相关的产品集合起来
  • 缺点
    如果加入新产品就必须改变接口
  • 用途
    用来创建整个产品家族和或想让制造相关的产品集合起来时

Implementation/Sample Code_实现/范例代码910

AbstractFactory

public interface PetFactory {
	Cat createCat();
	Dog createDog();
}

ConcreteFactory

public class WhitePetFactory implements PetFactory  {
	@Override
	public Cat createCat() {
		return new WhiteCat();
	}
	@Override
	public Dog createDog() {
		return new WhiteDog();
	}
}

public class BlackPetFactory implements PetFactory {
	@Override
	public Cat createCat() {
		return new BlackCat();
	}
	@Override
	public Dog createDog() {
		return new BlackDog();
	}
}

AbstractProduct

public interface Cat() {
	void eat();
}
public interface Dog() {
	void eat();
}

ConcreteProduct

public class WhiteCat implements Cat {
	@Override
	public void eat() {
		System.out.println("The white cat is eating");
	}
}
public class WhiteDog implements Dog {
	@Override
	public void eat() {
		System.out.println("The white dog is eating");
	}
}
public class BlackCat implements Cat {
	@Override
	public void eat() {
		System.out.println("The black cat is eating");
	}
}
public class BlackDog implements Dog {
	@Override
	public void eat() {
		System.out.println("The black dog is eating");
	}
}

Client

public class PetShop {
	Cat cat;
	Dog dog;
	public PetShop(PetFactory petFactory) {
		cat = petFactory.createCat();
		dog = petFactory.createDog();
	}
	void createPetShop() {
		cat.eat();
		dog.eat();
	}
}

Demo

public class Demo {
	public static void main(String[] args) {
		PetFactory whitePetFactory = new WhitePetFactory();
		PetFactory blackPetFactory = new BlackPetFactory();
		
		PetShop whitePetShop = new PetShop(whitePetFactory);
		whitePetShop.createPetShop();

		PetShop blackPetShop = new PetShop(blackPetFactory);
		blackPetShop.createPetShop();
	}
}

Result

The white cat is eating
The white dog is eating
The black cat is eating
The black dog is eating

Known Uses_已知应用11

Related Patterns_相关模式12

Factory Method(工厂方法) 抽象工厂的具体工厂经常实现工厂方法来创建其产品


  1. 模式分类归属 ↩︎

  2. 意图:描述该模式的作用,以及该模式的定义 ↩︎

  3. 动机:给出了问题以及如何解决这个问题的具体场景 ↩︎

  4. 适用性:描述模式可以被应用在什么场合 ↩︎

  5. 结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎

  6. 参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎

  7. 协作 :告诉参与者如何在此模式中合作 ↩︎

  8. 结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎

  9. 实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎

  10. 范例代码:提供代码的片段 ↩︎

  11. 已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎

  12. 相关模式:描述了此模式和其他模式之间的关系 ↩︎

你可能感兴趣的:(设计模式)