简单工厂模式

 

     简单工厂不属于23种GOF设计模式,但是也是一种比较常见的设计模式

特点:有一个工厂类。负责依据传入的参数,生成对应的具体产品对象,也就是说通过工厂类对创建对象做了统一的管理。

优点:产品使用者不需要关心产品类的创建过程,与具体产品的实现类达到解耦的效果;

缺点:违背"开放--封闭"原则(OCP),因为新增一个产品类的时候,需要修改原先的工厂方法;

 

举例:就像有一群人,都是做面包的师傅,每个人都会做属于自己的独特口味,以前呢在商场里都是单打独斗挣钱,现在他们组建成了一个专门生产面包的工厂,工厂每天接收订单,根据订单找到相应的面包师傅,面包师傅负责生产面包就行了。

 UML结构图

编码实现:

面包师傅类

package desgubproject2;
//面包师傅类
public  class BreakMarker {
	//面包师傅制作面包
    public  void getBreak(){
    	
    }
}

 面包师傅具体类

package desgubproject2;

//制作黑面包的面包师傅
public class MakeBlackBread extends BreakMarker {
    //实现方法
	@Override
	public void getBreak() {
	   System.out.println("制作出黑面包");
	}

}



package desgubproject2;
//制作蜂蜜面包的面包师傅
public class MarkHoneyBreak extends BreakMarker{
    //制作面包
	@Override
	public void getBreak() {
	  System.out.println("制作出蜂蜜面包");
	}
	
}


package desgubproject2;
//制作奶油面包的师傅
public class MarkWhiteBreak extends BreakMarker{
    //制作面包
	@Override
	public void getBreak() {
		System.out.println("制作出奶油面包");
	}

}

 工厂类:

package desgubproject2;
//面包生产的工厂类
public class BreakFactory {
	private BreakMarker breakMarker=null;   //工厂里要有面包师傅
	public BreakMarker MakeBreak(int BreakType){
		
		switch (BreakType) {   //输入需要的 面包类型
		case 1:
			breakMarker= new MakeBlackBread(); //寻找相应的面包师傅
			break;
		case 2:
			breakMarker=new MarkHoneyBreak();    //寻找相应的面包师傅
			break;
		case 3:
			breakMarker=new MarkWhiteBreak();   //寻找相应的面包师傅
			break;
		default:
			break;
		}
		return breakMarker;  //找到相应的面包师傅
	}
	

}

测试类

package desgubproject2;

import java.util.InputMismatchException;
import java.util.Scanner;

public class main {

	public static void main(String[] args) {
		System.out.println("黑面包类型为1");
		System.out.println("蜂蜜面包类型为2");
		System.out.println("奶油面包类型为3");
		System.out.println("请选择需要的面包");
		 BreakFactory bFactory =new BreakFactory();
		 Scanner sc=new Scanner(System.in);
		
		 while(sc.hasNext()){
			 try {
				 int type=sc.nextInt();
				 BreakMarker makeBreak = bFactory.MakeBreak(type);
				 makeBreak.getBreak();
			} catch (InputMismatchException e) {
				System.out.println("请输入正确类型");
				String type=sc.nextLine();
			}catch (NullPointerException e) {
				System.out.println("你说输入的面包不存在");
			}
			
		 }
		sc.close();
		
		 
	}

}

 

posted @ 2017-09-03 20:02  Actexpler  阅读(187)  评论(0编辑  收藏  举报