设计模式学习(二)abstract factory

1、      基本概念:

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端 提 供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据LSP原则,任何接受父类型的地方,都应当能够接受子类型。因此, 实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责 创建抽象产品的具体子类的实例。

每一个模式都是针对一定问题的解决方案, 工厂方法模式 针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。

2、      产品簇

  是指位于不同产品等级结构中,功能相关联的产品组成的家族。一般是位于不同的等级结构中的相同位置上。显然,每一个产品族中含有产品的数目,与产品等级结构的数目是相等的,形成一个二维的坐标系,水平坐标是产品等级结构,纵坐标是产品族。叫做相图。

  当有多个不同的等级结构的产品时,如果使用工厂方法模式就势必要使用多个独立的工厂等级结构来对付这多个产品的等级结构。如果这些产品等级结构是平行的,会导致多个平行的工厂等级结构。

  抽象工厂模式使用同一个 工厂等级结构负责多个个不同产品等级结构产品对象的创建。

  对于每一个产品族,都有一个具体工厂。而每一个具体工厂创建属于同一个产品族,但是分属于不同等级结构的产品。

  通过引进抽象工厂模式,可以处理具有相同(或者相似)等级结构的多个产品族中的产品对象的创建问题。

  由于每个具体工厂角色都需要负责两个不同等级结构的产品对象的创建,因此每个工厂角色都需要提供两个工厂方法,分别用于创建多个个等级结构的产品。既然每个具体工厂角色都需要实现这多个工厂方法,所以具有一般性,不妨抽象出来,移动到抽象工厂角色中加以声明。

3、      UML图:

设计模式学习(二)abstract factory

设计模式学习(二)abstract factory

设计模式学习(二)abstract factory

4、    代码

CarLight.java

package com.codeyangjun.partern.abstractFactory;

public interface CarLight {

}

 

BMWCarLight.java

package com.codeyangjun.partern.abstractFactory;

public class BMWCarLight implements CarLight {

	public BMWCarLight() {
		System.out.println("this is BWMCarLight");
	}
}

 

AudiCarLight.java

package com.codeyangjun.partern.abstractFactory;

public class BMWCarLight implements CarLight {

	public BMWCarLight() {
		System.out.println("this is BWMCarLight");
	}
}

 

Wheel.java

package com.codeyangjun.partern.abstractFactory;

public interface Wheel {

}

 

BMWWheel.java

package com.codeyangjun.partern.abstractFactory;

public class BMWWheel implements Wheel{
	
	public BMWWheel() {
		System.out.println("this is BMWWheel");
	}
}

 

AudiWheel.java

package com.codeyangjun.partern.abstractFactory;

public class AudiWheel implements Wheel{
	
	public AudiWheel() {
		System.out.println("this is AudiWheel");
	}
}
 

CarFactory.java

package com.codeyangjun.partern.abstractFactory;

public interface CarFactory {

	public CarLight createCarLight();
	public Wheel createWheel();
}

 

BMWCarFactory.java

package com.codeyangjun.partern.abstractFactory;

public class BMWCarFactory implements CarFactory {

	@Override
	public CarLight createCarLight() {
		return new BMWCarLight();
	}

	@Override
	public Wheel createWheel() {
		return new BMWWheel();
	}

}

 

AudiCarFactory.java

package com.codeyangjun.partern.abstractFactory;

public class AudiCarFactory implements CarFactory{

	@Override
	public CarLight createCarLight() {
		return new AudiCarLight();
	}

	@Override
	public Wheel createWheel() {
		
		return new AudiWheel();
	}

}

 

Client.java

package com.codeyangjun.partern.abstractFactory;

public class Client {

	
	public static void main(String[] args) {
		
		CarFactory audiFactory = new AudiCarFactory();
		CarLight audiCarLight = audiFactory.createCarLight();
		Wheel audiWheel = audiFactory.createWheel();
		
		
		System.out.println("--------------");
		CarFactory BMWFactory = new BMWCarFactory();
		CarLight BMWCarLight = BMWFactory.createCarLight();
		Wheel BMWWheel = BMWFactory.createWheel();
	}

}