• 简单工厂模式


         简单工厂不属于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();
    		
    		 
    	}
    
    }
    
  • 相关阅读:
    水晶报表基础操作技巧收藏
    注册表里相应的
    .Net 中的反射(动态创建类型实例) Part.4动态创建对象
    .Net 中的反射(查看基本类型信息) Part.2
    Javascript多级菜单
    诡异的中毒现象
    js魔力代码
    Silverlight入门教程
    Silverlight 2.0中文学习资源集萃
    jatoolsPrinter 2手册
  • 原文地址:https://www.cnblogs.com/Actexpler-S/p/7470716.html
Copyright © 2020-2023  润新知