一:产生背景
过于频繁的使用new
关键字来创建对象,当工程过于庞大,需要修改时,这时极有可能“牵一发而动全身”,与面向对象的基本原则相违背。使用工程模式后,将代码细节封装起来,对外只暴露关键部分,将重复部分封装为一个接口,从而达到面向对象的要求。
二:工程简览
说明:以下工程包括如下部分:
文件名 | 作用 |
---|---|
FlightFactory | 工程模式,用来获取战斗机对象的关键 |
Flight | 战斗机接口,有一个抽象方法fire() |
FlightProduce | 用来测试生产战斗机的类 |
J10 | J10战斗机,其实现了Flight 接口,并重写其抽象方法 |
J20 | J20战斗机,其实现了Flight 接口,并重写其抽象方法 |
J11 | J11战斗机,其实现了Flight 接口,并重写其抽象方法 |
F16 | F16战斗机,其实现了Flight 接口,并重写其抽象方法 |
F22 | F22战斗机,其实现了Flight 接口,并重写其抽象方法 |
F35 | F35战斗机,其实现了Flight 接口,并重写其抽象方法 |
三:实现
Flight.java
说明:定义一个名Flight的接口。通常认知下战斗机必有“开火”的功能,用来攻击其它战斗机或目标。具体是用机炮攻击,还是用地空导弹、地地导弹我们不得而知,因为这取决于具体的战斗机(例如J20是唯一一款没有装备机炮的五代机)。那么我们就可以定义一个抽象方法fire()
来大致描述其攻击行为。
public interface Flight {
public void fire();
}
FlightFactory.java
说明:该类有唯一一个方法,其返回类型为Flight
,参数为para
,当我们实例化该类并调用getFlight()
的时候就进入了判断,如果参数为xxx,就把对应xxx的匿名对象返回过来赋值给某个待赋值的对象;如果没有对应的参数就返回为null
。
public class FlightFactory {
public Flight getFlight(String para){
switch(para){
case "J20":
return new J20();
case "J11":
return new J11();
case "J10":
return new J10();
case "F16":
return new F16();
case "F35":
return new F35();
case "F22":
return new F22();
default:
return null;
}
}
}
J10.java:
说明:该战斗机重写了fire()
方法,里面有自己的战斗逻辑(println内打印的东西不一样)。
public class J10 implements Flight{
@Override
public void fire() {
// TODO Auto-generated method stub
System.out.println("J10 open fire.");
}
}
J11.java:
public class J11 implements Flight{
@Override
public void fire() {
// TODO Auto-generated method stub
System.out.println("J11 open fire.");
}
}
由于J20、F16、F22、F35这几个类实现内容大致相同,唯一不同的就是其重写方法fire()
内所打印的内容不太一样,故这个就省略。
FlightProduce.java
说明:我们在这里模拟战斗机生产并让生产好(实例化完成)的战斗机开火。每个战斗机对象的实例化不再是通过new
来获得,而是通过FlightFactory
实例化对象的getFlight
决定。
public class FactoryProduce {
public static void main(String args[]){
FlightFactory flightFactory = new FlightFactory();
Flight j20 = flightFactory.getFlight("J20");
j20.fire();
Flight j11 = flightFactory.getFlight("J11");
j11.fire();
Flight j10 = flightFactory.getFlight("J10");
j10.fire();
Flight f22 = flightFactory.getFlight("F22");
f22.fire();
Flight f35 = flightFactory.getFlight("F35");
f35.fire();
Flight f16 = flightFactory.getFlight("F16");
f16.fire();
}
}
结果:
J20 open fire.
J11 open fire.
J10 open fire.
F22 open fire.
F35 open fire.
F16 open fire.