• 简单工厂模式


         简单工厂不属于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();
    		
    		 
    	}
    
    }
    
  • 相关阅读:
    集合类源码(六)Map(HashMap, Hashtable, LinkedHashMap, WeakHashMap)
    CycleBarrier与CountDownLatch原理
    Volatile和Synchronized
    集合类源码(五)Collection之BlockingQueue(LinkedTransferQueue, PriorityBlockingQueue, SynchronousQueue)
    集合类源码(三)Collection之List(CopyOnWriteArrayList, Stack)
    集合类源码(二)Collection之List(ArrayList, LinkedList, Vector)
    集合类源码(一)概述
    Java ReentrantLock中tryLock与lock的区别(非公平锁与公平锁)
    Arctime制作视频字幕教程
    用Pr对视频画面进行裁剪
  • 原文地址:https://www.cnblogs.com/Actexpler-S/p/7470716.html
Copyright © 2020-2023  润新知