zoukankan      html  css  js  c++  java
  • 设计模式之工厂模式

      工厂模式是一种常用的实例化对象的设计模式,它用工厂方法代替了实例化对象时的new操作。工厂模式主要分为三种,分别是简单工厂,工厂方法和抽象工厂。我们来一一介绍。

      假定工厂生产的产品需要一个统一的接口如下:

    package 工厂模式;
    /**
     * 统一的产品接口
     */
    public interface Product {
    	public String ProStandard();
    }  

      1.简单工厂

      

    package 工厂模式;
    /**
     * 简单工厂
     * 		定义一个产品接口Product
     * 			然后定义实现Porduct接口的三个产品实现类,Washer,IceBox,AirCondithon
     * 		在SimpleFactory类里,直接生产相应的产品
     */
    public class SimpleFactory {
    	/**
    	 * 根据传递的产品名称来生产产品
    	 * @param productName
    	 * @return
    	 * @throws Exception
    	 */
    	static Product createProduct(String productName) throws Exception{
    		if("Washer".equals(productName)){
    			return new Washer();
    		}else if("IceBox".equals(productName)){
    			return new IceBox();
    		}else if("AirCondition".equals(productName)){
    			return new AirCondition();
    		}else{
    			throw new Exception("没有该产品!");
    		}
    		
    	}
    	/**
    	 * 入口函数
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		//生产三种产品
    		try {
    			createProduct("Washer");
    			//如果输错产品名称,会导致无法生产
    //			createProduct("Washer1");
    			createProduct("IceBox");
    			createProduct("AirCondition");
    			//生产暂时没有的产品时,需要再创建相应的产品实现类,而且要多出修改
    //			createProduct("Television");
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    
    /**
     * 	洗衣机
     * @author Administrator
     *
     */
    class Washer implements Product{
    	/**
    	 * 实例化时就生产洗衣机
    	 */
    	public Washer() {
    		System.out.println(ProStandard()+"洗衣机生产了!");
    	}
    
    	@Override
    	public String ProStandard() {
    		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
    	}
    }
    	
    /**
     * 冰箱	
     */
    class IceBox implements Product{
    	/**
    	 * 实例化时就生产冰箱
    	 */
    	public IceBox(){
    		System.out.println(ProStandard()+"冰箱生产了!");
    	}
    
    	@Override
    	public String ProStandard() {
    		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
    	}
    }
    /**
     * 空调
     */
    class AirCondition implements Product{
    	/**
    	 * 实例化时就生产空调
    	 */
    	public AirCondition(){
    		System.out.println(ProStandard()+"空调生产了!");
    	}
    
    	@Override
    	public String ProStandard() {
    		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
    	}
    }
    

      上述代码执行后,控制台打印如下:

    ==符合Washer产品标准---洗衣机生产了!
    ==符合IceBox产品标准---冰箱生产了!
    ==符合AirCondition产品标准---空调生产了!
    

      简单工厂存在高耦合的情况,如果产品的生产计划更改,需要在源代码中更改,不符合面向对象中的“向继承开放,向修改关闭”的原则。

      2.工厂方法

      

    package 工厂模式;
    /**
     * 定义一个统一的工厂接口
     */
    public interface Factory {
    	public String facStandard();
    	//public Product createProduct();
    }
    ---------------------------------------------------------
    package 工厂模式;
    	/**
    	 * 工厂方法
    	 * 		声明实现Factory接口的三个工厂类,分别生产洗衣机,冰箱,空调
    	 * 		这些工厂实现类里均有生产产品的方法
    	 */
    public class FactoyMethod {
    	//程序入口方法
    	public static void main(String[] args) {
    		new WasherFactory().createProduct();
    		new IceBoxFactory().createProduct();
    		new AirConditionFactory().createProduct();
    	}
    }
    
    /**
     * 洗衣机厂
     */
    class WasherFactory implements Factory{
    	@Override
    	public String facStandard() {
    		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
    	}
    
    //	@Override
    	public Product createProduct() {
    		System.out.println(facStandard());
    		return new Washer();
    	}	
    }
    
    /**
     * 冰箱厂
     */
    class IceBoxFactory implements Factory{
    
    	@Override
    	public String facStandard() {
    		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
    	}
    
    //	@Override
    	public Product createProduct() {
    		System.out.println(facStandard());
    		return new IceBox();
    	}	
    }
    
    /**
     * 空调厂
     */
    class AirConditionFactory implements Factory{
    
    	@Override
    	public String facStandard() {
    		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
    	}
    
    //	@Override
    	public Product createProduct() {
    		System.out.println(facStandard());
    		return new AirCondition();
    	}	
    }
    

      上述代码执行后,控制台打印如下:

    ***符合WasherFactory工厂标准---
    ==符合Washer产品标准---洗衣机生产了!
    ***符合IceBoxFactory工厂标准---
    ==符合IceBox产品标准---冰箱生产了!
    ***符合AirConditionFactory工厂标准---
    ==符合AirCondition产品标准---空调生产了!
    

      工厂方法可以通过某些专业的工厂来生产特定产品,在解耦合方面比简单工厂有很大的进步。但是,在面临更为复杂的生产形势,尤其是产品线更为庞大时,就要采用抽象工厂了。

      3.抽象工厂

      

    package 工厂模式;
    	/**
    	 * 抽象工厂
    	 * 		便于产品分类
    	 */
    public class AbstractFactory {
    	public static void main(String[] args) {
    		new WasherFactory_A_Depart().createProduct();
    		new WasherFactory_B_Depart().createProduct();
    		new IceBoxFactory_A_Depart().createProduct();
    		new IceBoxFactory_B_Depart().createProduct();
    		new AirConditionFactory_A_Depart().createProduct();
    		new AirConditionFactory_B_Depart().createProduct();
    	}
    }
    
    /**
     * 洗衣机产品
     */
    abstract class WasherAbstract implements Product {
    }
    /**
     * 洗衣机产品A系列
     */
    class Washer_A extends WasherAbstract{
    	public Washer_A(){
    		System.out.println(this.toString());
    	}
    	@Override
    	public String ProStandard() {
    		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
    	}
    	@Override
    	public String toString() {
    		return ProStandard()+this.getClass().getSimpleName()+"生产了!";
    	}		
    }
    /**
     * 洗衣机产品B系列
     */
    class Washer_B extends WasherAbstract{
    	public Washer_B(){
    		System.out.println(this.toString());
    	}
    	@Override
    	public String ProStandard() {
    		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
    	}
    	@Override
    	public String toString() {
    		return ProStandard()+this.getClass().getSimpleName()+"生产了!";
    	}	
    }
    
    /**
     * 冰箱产品
     */
    abstract class IceBoxAbstract implements Product{}
    /**
     * 冰箱产品A系列
     */
    class IceBox_A extends IceBoxAbstract{
    	public IceBox_A(){
    		System.out.println(this.toString());
    	}
    	@Override
    	public String ProStandard() {
    		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
    	}
    	@Override
    	public String toString() {
    		return ProStandard()+this.getClass().getSimpleName()+"生产了!";
    	}	
    }
    /**
     * 冰箱产品B系列
     */
    class IceBox_B extends IceBoxAbstract{
    	public IceBox_B(){
    		System.out.println(this.toString());
    	}
    	@Override
    	public String ProStandard() {
    		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
    	}
    	@Override
    	public String toString() {
    		return ProStandard()+this.getClass().getSimpleName()+"生产了!";
    	}	
    }
    
    /**
     * 空调产品
     */
    abstract class AirConditionAbstract implements Product{}
    /**
     * 空调产品A系列
     */
    class AirCondition_A extends AirConditionAbstract{
    	public AirCondition_A(){
    		System.out.println(this.toString());
    	}
    	@Override
    	public String ProStandard() {
    		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
    	}
    	@Override
    	public String toString() {
    		return ProStandard()+this.getClass().getSimpleName()+"生产了!";
    	}	
    }
    /**
     * 空调产品B系列
     */
    class AirCondition_B extends AirConditionAbstract{
    	public AirCondition_B(){
    		System.out.println(this.toString());
    	}
    	@Override
    	public String ProStandard() {
    		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
    	}
    	@Override
    	public String toString() {
    		return ProStandard()+this.getClass().getSimpleName()+"生产了!";
    	}	
    }
    /**
     * 洗衣机工厂
     * @author Administrator
     *
     */
    abstract class WasherFactoryAbstract implements Factory{}
    /**
     * 生产洗衣机产品A系列的车间
     */
    class WasherFactory_A_Depart extends WasherFactoryAbstract{
    
    	@Override
    	public String facStandard() {
    		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
    	}
    
    //	@Override
    	public Product createProduct() {
    		System.out.println(facStandard());
    		return new Washer_A();
    	}	
    }
    /**
     * 生产洗衣机产品B系列的车间
     */
    class WasherFactory_B_Depart extends WasherFactoryAbstract{
    
    	@Override
    	public String facStandard() {
    		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
    	}
    
    //	@Override
    	public Product createProduct() {
    		System.out.println(facStandard());
    		return new Washer_B();
    	}	
    }
    /**
     * 冰箱工厂
     */
    abstract class IceBoxFactoryAbstract implements Factory{}
    /**
     * 生产冰箱产品A系列的车间
     */
    class IceBoxFactory_A_Depart extends IceBoxFactoryAbstract{
    
    	@Override
    	public String facStandard() {
    		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
    	}
    
    //	@Override
    	public Product createProduct() {
    		System.out.println(facStandard());
    		return new IceBox_A();
    	}	
    }
    /**
     * 生产冰箱产品B系列的车间
     */
    class IceBoxFactory_B_Depart extends IceBoxFactoryAbstract{
    
    	@Override
    	public String facStandard() {
    		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
    	}
    
    //	@Override
    	public Product createProduct() {
    		System.out.println(facStandard());
    		return new IceBox_B();
    	}	
    }
    /**
     * 空调工厂
     */
    abstract class AirConditionFactoryAbstract implements Factory{}
    /**
     * 生产空调产品A系列的车间
     */
    class AirConditionFactory_A_Depart extends AirConditionFactoryAbstract{
    
    	@Override
    	public String facStandard() {
    		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
    	}
    
    //	@Override
    	public Product createProduct() {
    		System.out.println(facStandard());
    		return new AirCondition_A();
    	}	
    }
    /**
     * 生产空调产品B系列的车间
     */
    class AirConditionFactory_B_Depart extends AirConditionFactoryAbstract{
    
    	@Override
    	public String facStandard() {
    		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
    	}
    
    //	@Override
    	public Product createProduct() {
    		System.out.println(facStandard());
    		return new AirCondition_B();
    	}	
    }
    

      上述代码执行后,控制台打印如下:

    ***符合WasherFactory_A_Depart工厂标准---
    ==符合Washer_A产品标准---Washer_A生产了!
    ***符合WasherFactory_B_Depart工厂标准---
    ==符合Washer_B产品标准---Washer_B生产了!
    ***符合IceBoxFactory_A_Depart工厂标准---
    ==符合IceBox_A产品标准---IceBox_A生产了!
    ***符合IceBoxFactory_B_Depart工厂标准---
    ==符合IceBox_B产品标准---IceBox_B生产了!
    ***符合AirConditionFactory_A_Depart工厂标准---
    ==符合AirCondition_A产品标准---AirCondition_A生产了!
    ***符合AirConditionFactory_B_Depart工厂标准---
    ==符合AirCondition_B产品标准---AirCondition_B生产了!
  • 相关阅读:
    js float浮点数计算精度问题
    NLB多WEB站点访问共享文件解决方案
    Flash文件跨域访问
    博客地址
    在Ubuntu上安装Mysql
    Ajax调用NPOI导出Excel报表
    在Ubuntu上安装Mongodb
    获取月份的周时间段
    sql表结构和注释
    Highcharts使用指南
  • 原文地址:https://www.cnblogs.com/lizhangyong/p/8729411.html
Copyright © 2011-2022 走看看