工厂模式 Java实现

一:产生背景

过于频繁的使用new关键字来创建对象,当工程过于庞大,需要修改时,这时极有可能“牵一发而动全身”,与面向对象的基本原则相违背。使用工程模式后,将代码细节封装起来,对外只暴露关键部分,将重复部分封装为一个接口,从而达到面向对象的要求。

二:工程简览

说明:以下工程包括如下部分:

文件名作用
FlightFactory工程模式,用来获取战斗机对象的关键
Flight战斗机接口,有一个抽象方法fire()
FlightProduce用来测试生产战斗机的类
J10J10战斗机,其实现了Flight接口,并重写其抽象方法
J20J20战斗机,其实现了Flight接口,并重写其抽象方法
J11J11战斗机,其实现了Flight接口,并重写其抽象方法
F16F16战斗机,其实现了Flight接口,并重写其抽象方法
F22F22战斗机,其实现了Flight接口,并重写其抽象方法
F35F35战斗机,其实现了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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值