1). 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类.
2). 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合.
3). 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象).
4). 将工厂抽象成两层,AbsFactory(抽象工厂)和具有实现的工厂子类,程序员可以根据创建对象类型使用对应的工厂子类. 这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展.
抽象工厂模式类图:
工厂接口和类
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类的动作放在一个工厂的方法中,并返回。