zoukankan      html  css  js  c++  java
  • 简单工厂模式

         简单工厂不属于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();
    		
    		 
    	}
    
    }
    
  • 相关阅读:
    java常用配置文件头部声明
    Error while launching application Error: spawn ENOMEM 解决
    Maven添加依赖后如何在IDEA中引用
    2017-2018 ACM-ICPC East Central North America Regional Contest (ECNA 2017)部分题解
    最小一乘法的一种数值算法?
    LOJ 6409. 「ICPC World Finals 2018」熊猫保护区
    min-max容斥复习
    BMCH
    大象
    关于高维卷积的一些不成熟的想法
  • 原文地址:https://www.cnblogs.com/Actexpler-S/p/7470716.html
Copyright © 2011-2022 走看看