简单工厂不属于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(); } }