1). 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类.


2). 抽象工厂模式可以将简单工厂模式工厂方法模式进行整合.


3). 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象).


4). 将工厂抽象成两层,AbsFactory(抽象工厂)和具有实现的工厂子类,程序员可以根据创建对象类型使用对应的工厂子类. 这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展.
 

抽象工厂模式类图:

设计模式:抽象工厂模式_简单工厂模式

 设计模式:抽象工厂模式_ide_02

 

 工厂接口和类

package com.China.factory.absfactory.order;

import com.China.factory.absfactory.plane.Plane;

public interface AbsFactory {
	Plane createPlane(String orderType);
}
package com.China.factory.absfactory.order;

import com.China.factory.absfactory.plane.*;
import com.China.factory.absfactory.plane.Plane;

public class ChinaFactory implements AbsFactory{

	@Override
	public Plane createPlane(String orderType) {
		System.out.println("抽象工厂模式...");
		
		Plane plane = null;
		if(orderType.equals("Fighter")){
			plane = new ChinaFighter();
		}else if(orderType.equals("Airliner")){
			plane = new ChinaAirliner();
		}
		
		return plane;
	}

}
package com.China.factory.absfactory.order;

import com.China.factory.absfactory.plane.*;

public class EUFactory implements AbsFactory{

	@Override
	public Plane createPlane(String orderType) {
		System.out.println("抽象工厂模式...");
		
		Plane plane = null;
		if(orderType.equals("Fighter")){
			plane = new EUFighter();
		}else if(orderType.equals("Airliner")){
			plane = new EUAirliner();
		}
		
		return plane;
	}

}

 把工厂聚合到订单类中

package com.China.factory.absfactory.order;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import com.China.factory.absfactory.plane.Plane;


public class OrderPlane {
	AbsFactory factory;
	
	public OrderPlane(AbsFactory factory){
		this.factory = factory;
		
		Plane plane = null;
		String orderType; // 订购飞机类型
		do{
			orderType = getType();
			plane = factory.createPlane(orderType);
			
			if(null == plane)
				break;
			
			// 输出飞机的生产过程
			plane.prepare();
			plane.process();
			plane.fly();
		}
		while(true);
	}
	
	private String getType(){
		try {
			BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
			System.out.println("input the type:");
			String str;
			
			str = strin.readLine();
	
			return str;
		} catch (IOException e) {
			e.printStackTrace();
		}
			
		return "";
	}
}

 

工厂模式的意义:


  将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。

  3中工厂模式(简单工厂模式, 工厂方法模式, 抽象工厂模式)
  
  创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中,并返回。