设计模式:简单工厂模式_java

飞机抽象类

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原则,即对扩展开放,对修改关闭。 即当我们给类增加新功能的时,尽量不修改代码,或者尽可能少修改代码。

 

  简单工厂模式: 

     定义一个创建对象的类,由这个类来封装实例化对象的行为(代码)。是工厂模式家族中最简单实用的模式。

  

 那么以上代码,就可以通过简单工厂模式进行重构.

设计模式:简单工厂模式_简单工厂_02

  增加一个简单工厂类

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 "";
	}
}

  使用简单工厂模式后, 以后增加新的飞机类型,只需要修改简单工厂即可。