• java 简单工厂 工厂模式


                        《Head First 设计模式》学习中

    分类

    • 简单工厂模式(Simple Factory) 
    • 工厂方法模式(Factory Method) 
    • 抽象工厂模式(Abstract Factory) 

    介绍

    • 简单工厂模式:

        简单工厂其实并不是一个设计模式,反而比较像是一种编程习惯,但是由于经常被使用,所以才被称为简单工厂模式,你可以把它看为工厂模式的一种特例,但是不能因为它不是一个真正的设计模式,就忽略它。

    • 工厂方法模式:           

         一个抽象产品类,可以派生出多个具体产品类。   
                  一个抽象工厂类,可以派生出多个具体工厂类。   
                  每个具体工厂类只能创建一个具体产品类的实例。

    • 抽象工厂模式:

        多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   
        一个抽象工厂类,可以派生出多个具体工厂类。   
        每个具体工厂类可以创建多个具体产品类的实例。   

    • 区别:

        工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   
        工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

    简单工厂类图

        

    简单工厂实例

      产品类

    package com.Observer.model;
    
    public  class food {
    	
    	public food(){
    	}
    	
    	
    	
    }
    

     具体产品类

    package com.Observer.model;
    
    public class ChickenPot extends food {
    	
    	public ChickenPot(){
    		System.out.println("黄焖鸡");
    	}
    	
    }
    

      

    package com.Observer.model;
    
    public class Noodles extends food {
    	
    	public Noodles(){
    		System.out.println("砂锅方便面");
    	}
    	
    	
    }
    

     工厂类

    package com.Observer.model;
    
    public class SimpleFoodFactory {
    	
    	public food create(String type){
    		
    		if(type.equals("黄焖鸡")){
    			
    			return new ChickenPot();
    			
    		}else if(type.equals("砂锅方便面")){
    			
    			return new Noodles();
    			
    		}
    		
    		return null;
    		
    	}
    }
    

     测试类

    package com.Observer.model;
    
    public class Test {
    	public static void main(String[] args) {
    		SimpleFoodFactory factory = new SimpleFoodFactory();
    		
    		food food = factory.create("砂锅方便面");
    		
    		food food1 = factory.create("黄焖鸡");
    	}
    }
    

     输出结果:

    砂锅方便面
    黄焖鸡
    

     简单工厂的优势: 

        如果以后要实现改变的时候,只需要修改工厂类就可以

    工厂模式实例:

      利用简单工厂开的饭店太红火了,引来了两个代理商,因为我们的代码处理方便使用,所以他们想使用我们的代码来确保质量。这样我们就可以使用工厂模式

     产品类:

    package com.Observer.model;
    
    public abstract class food {
    	
    	public food(){
    	}
    }

      具体产品类

    package com.Observer.model;
    
    public class ChickenPot extends food {
    	
    	public ChickenPot(String name){
    		System.out.println(name + " :黄焖鸡");
    	}
    	
    }
    
    package com.Observer.model;
    
    public class Noodles extends food {
    	
    	public Noodles(String name){
    		System.out.println(name + " :砂锅方便面");
    	}
    	
    	
    }

     工厂接口

    package com.Observer.model;
    
    public interface factoryFood  {
    	
    	food create(String type);
    }
    

     工厂实现类

    package com.Observer.model;
    /**
     * 通州店
     * @author Administrator
     *
     */
    public class TongFood implements factoryFood {
    
    	@Override
    	public food create(String type) {
    		if (type.equals("黄焖鸡")) {
    
    			return new ChickenPot("通州分店");
    
    		} else if (type.equals("砂锅方便面")) {
    
    			return new Noodles("通州分店");
    
    		}
    
    		return null;
    	}
    
    }
    

      

    package com.Observer.model;
    /**
     * 昌平店
     * @author Administrator
     *
     */
    public class ChangFood implements factoryFood {
    
    	@Override
    	public food create(String type) {
    		if (type.equals("黄焖鸡")) {
    
    			return new ChickenPot("昌平分店");
    
    		} else if (type.equals("砂锅方便面")) {
    
    			return new Noodles("昌平分店");
    
    		}
    
    		return null;
    	}
    
    }

    测试类

    package com.Observer.model;
    
    public class Test {
    	public static void main(String[] args) {
    		factoryFood factory =  new TongFood();
    		factory.create("黄焖鸡");
    		
    		factoryFood factory1 =  new ChangFood();
    		
    		factory1.create("砂锅方便面");
    	}
    }

    输出结果:

    通州分店 :黄焖鸡
    昌平分店 :砂锅方便面
    

      

    工厂方法模式:

      定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类

     参考:  http://blog.csdn.net/jason0539/article/details/23020989

     

  • 相关阅读:
    Hive、Presto、Kylin、Impala、Sparksql、Druid 区别
    HIVE vs HBASE
    mysql vs mongodb
    关于MCU 开门狗要求
    JAVA转OC j2objc
    DTD文件映射
    装饰者模式(Decorator)
    Spring Boot 概述
    C语言也会短路?盘点C语言中那些令人匪夷所思的情况!
    程序员的天梯排行榜!你的理想高度在哪里?
  • 原文地址:https://www.cnblogs.com/chenlizhi/p/7817414.html
Copyright © 2020-2023  润新知