飞机抽象类
package com.China.factory.simplefactory.plane;
public abstract class Plane {
protected String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void prepare();
public void process(){
System.out.println(name+"飞机零件加工...");
}
public void fly(){
System.out.println(name+"飞机成功起飞...");
}
}
飞机的实现类
package com.China.factory.simplefactory.plane;
// 战斗机
public class Fighter extends Plane{
@Override
public void prepare() {
System.out.println("为战斗机准备零部件");
}
}
package com.China.factory.simplefactory.plane;
// 客机
public class Airliner extends Plane{
@Override
public void prepare() {
System.out.println("为客机准备零部件");
}
}
飞机订单类
package com.China.factory.simplefactory.order;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import com.China.factory.simplefactory.plane.Airliner;
import com.China.factory.simplefactory.plane.Fighter;
import com.China.factory.simplefactory.plane.Plane;
public class OrderPlane {
// 构造器
public OrderPlane(){
Plane plane = null;
String orderType; // 订购飞机类型
do{
orderType = getType();
if(orderType.equals("Fighter")){
plane = new Fighter();
plane.setName("战斗机");
}else if(orderType.equals("Airliner")){
plane = new Airliner();
plane.setName("客机");
}else{
System.out.println("没有此类型飞机!!!");
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 "";
}
}
package com.China.factory.simplefactory.order;
public class PlaneStore {
public static void main(String[] args){
new OrderPlane();
}
}
传统的方式处理飞机订单问题:
1). 这种方式优点是比较好理解,简单易操作。
2). 缺点是违反了设计模式的ocp原则,即对扩展开放,对修改关闭。 即当我们给类增加新功能的时,尽量不修改代码,或者尽可能少修改代码。
简单工厂模式:
定义一个创建对象的类,由这个类来封装实例化对象的行为(代码)。是工厂模式家族中最简单实用的模式。
那么以上代码,就可以通过简单工厂模式进行重构.
增加一个简单工厂类
package com.China.factory.simplefactory.order;
import com.China.factory.simplefactory.plane.Airliner;
import com.China.factory.simplefactory.plane.Fighter;
import com.China.factory.simplefactory.plane.Plane;
// 简单工厂类
public class SimpleFactory {
public Plane createPlane(String orderType){
System.out.println("使用简单工厂模式");
Plane plane = null;
if(orderType.equals("Fighter")){
plane = new Fighter();
plane.setName("战斗机");
}else if(orderType.equals("Airliner")){
plane = new Airliner();
plane.setName("客机");
}
return plane;
}
}
修改订单类,使用简单工厂创建飞机类
package com.China.factory.simplefactory.order;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import com.China.factory.simplefactory.plane.Airliner;
import com.China.factory.simplefactory.plane.Fighter;
import com.China.factory.simplefactory.plane.Plane;
public class OrderPlane {
Plane plane = null;
// 构造器
public OrderPlane(SimpleFactory simpleFactory){
setFactory(simpleFactory);
}
// 定义一个简单工厂对象
SimpleFactory simpleFactory;
public void setFactory(SimpleFactory simpleFactory){
this.simpleFactory = simpleFactory;
String orderType = "";
do{
orderType = getType();
plane = this.simpleFactory.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 "";
}
}
使用简单工厂模式后, 以后增加新的飞机类型,只需要修改简单工厂即可。