java设计模式——Abstract Factory模式

java设计模式——Abstract Factory模式

1、Abstract Factory(抽象工厂)模式简介

抽象工厂模式:相对于builder(建造者)模式来说,抽象工厂模式是围绕一个超级工厂创建其他工厂,而非在一个工厂内去定义他需要哪些具体功能。在抽象工厂模式中,可以根据不同的接口来区分超级工厂下不同的工厂。
意图:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
使用的场景:系统的产品有多于一个的产品族,而系统只使用其中某一族的产品。以鱼来举例子。鱼就相当于是一个系统,而该系统中又分为淡水鱼和海鱼两个产品族。而对于这两个产品族又都包含大鱼和小鱼这两个产品。而当我们要创建淡水大鱼的时候,我们并不需要知道如何创建这个对象,只需要调用淡水鱼中创建大鱼类的方法就可以。

2、角色定义

抽象工厂类:核心,定义用于生成抽象产品的接口。
抽象产品类:各种产品的抽象接口或抽象类。
具体工厂类:实现抽象工厂中的方法,生成一组具体产品。(生成的是一组产品,也即前文中的超级大厂里的各个工厂)但是我们可以根据需要选择只生成其中的某一产品。
具体产品类:实现抽象产品的接口的类。

3、代码呈现

步骤一:创建抽象工厂类

interface fAbstractFactory{  将鱼统分为大鱼和小鱼。所以在这个超级工厂里只需要知道有这两大类
	public Bfish createBfish(String name);
	public Sfish createSfish(String name);
}

步骤二:创建抽象产品类

interface Bfish{
	void printName();
}
interface Sfish{
	void printName();
}

步骤三:创建具体工厂类
我将大鱼和小鱼又分别细分为淡水鱼和海鱼。作为一个产品族里的两个子产品

class FreshwaterFactory implements fAbstractFactory{ 淡水鱼工厂(产品1)
	public Bfish createBfish(String name) {   创建淡水大鱼
		return new FreshwaterBFish(name);
	}
	public Sfish createSfish(String name) {   创建淡水小鱼
		return new FreshwaterSFish(name);
	}
}
class SeaFactory implements fAbstractFactory{  海鱼工厂(产品2)
	public Bfish createBfish(String name) {	  创建海水大鱼
		return new SeaBFish(name);
	}
	public Sfish createSfish(String name) {   创建海水小鱼
		return new SeaSFish(name);
	}
}

步骤四:创建具体产品类

class FreshwaterBFish implements Bfish{
	private String name;
	
	public FreshwaterBFish(String name) {
		this.name = name;
	}
	public String getName() {
		return this.name;
	}
	public void printName() {
		System.out.println("淡水"+this.name);
	}
}
class SeaBFish implements Bfish{
	private String name;
	
	public SeaBFish(String name) {
		this.name = name;
	}
	public String getName() {
		return this.name;
	}
	public void printName() {
		System.out.println("海水"+this.name);
	}
}
class FreshwaterSFish implements Sfish{
	private String name;
	
	public FreshwaterSFish(String name) {
		this.name = name;
	}
	public String getName() {
		return this.name;
	}
	public void printName() {
		System.out.println("淡水"+this.name);
	}
}
class SeaSFish implements Sfish{
	private String name;
	
	public SeaSFish(String name) {
		this.name = name;
	}
	public String getName() {
		return this.name;
	}
	public void printName() {
		System.out.println("海水"+this.name);
	}
}

测试:

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		fAbstractFactory FreshwaterFactory = new FreshwaterFactory();
		Bfish fish1 = FreshwaterFactory.createBfish("大鱼1");
		Sfish fish2 = FreshwaterFactory.createSfish("小鱼2");
		fish1.printName();
		fish2.printName();
		
		fAbstractFactory SeaFactory = new SeaFactory();
		Bfish fish3 = SeaFactory.createBfish("大鱼3");
		Sfish fish4 = SeaFactory.createSfish("小鱼4");
		fish3.printName();
		fish4.printName();
		
	}

}
淡水大鱼1
淡水小鱼2
海水大鱼3
海水小鱼4

4、总结

       使用抽象工厂模式来设计系统的时候,系统独立于它的产品的创建、组合和表示。但是当想要扩展该系统中的产品的时候,需要修改其下的每一个产品也即要修改每一个子类。
       和builder(建造者)模式做比较,抽象工厂模式更注重创造的结果。因此在抽象工厂类中重点返回的是一个实例。而builder模式更注重创建东西的过程。

你可能感兴趣的:(java设计模式——Abstract Factory模式)