zoukankan      html  css  js  c++  java
  • 设计模块之简单工厂

    简单工厂模式:从名字来看 工厂:就是生产产品的,那么在java中肯定是创建对象的,而在java中创建对象我们new一个就是了,为什么还要使用工厂去new对象呢?先看下简单工厂模式后再回来解释这个问题


    简单工厂模式的定义:提供一个创建实例功对象的功能,而无需关心其详细的实现,被创建实例的类型能够是接口,抽象类,详细的类


    简单工厂结构如图:


    说明:

    Api:定义客户所需的功能接口(也就是获取创建实例的对象)

    Impl:详细实现Api的实现类,可能会有多个

    Factory:工厂。选择合适的实现类来创建Api接口对象

    Client:client,通过Factory去获取Api接口对象,然后面向Api接口编程


    代码例如以下:

    Api.java

    /**
     * 接口的定义,该接口能够通过简单工厂来创建
     */
    public interface Api {
    	/**
    	 * 示意,详细的功能方法的定义
    	 * @param s 示意,须要的參数
    	 */
    	public void operation(String s);
    }

    Factory.java

    /**
     * 工厂类,用来创造Api对象
     */
    public class Factory {
    	/**
    	 * 详细的创造Api对象的方法
    	 * @param condition 示意。从外部传入的选择条件
    	 * @return 创造好的Api对象
    	 */
    	public static Api createApi(int condition){
    		//应该依据某些条件去选择到底创建哪一个详细的实现对象
    		//这些条件能够从外部传入,也能够从其他途径获取
    		//假设仅仅有一个实现。能够省略条件,由于没有选择的必要
    		
    		//示意使用条件
    		Api api = null;
    		if(condition == 1){
    			api = new ImplA();
    		}else if(condition == 2){
    			api = new ImplB();
    		}
    		return api;
    	}
    }
    ImplA.java

    /**
     * 接口的详细实现对象A 
     */
    public class ImplA implements Api{
    	public void operation(String s) {
    		//实现功能的代码,示意一下
    		System.out.println("ImplA s=="+s);
    	}
    }

    ImplB.java

    /**
     * 接口的详细实现对象B 
     */
    public class ImplB implements Api{
    	public void operation(String s) {
    		//实现功能的代码,示意一下
    		System.out.println("ImplB s=="+s);
    	}
    }

    Client.java

    /**
     * client。使用Api接口
     */
    public class Client {
    	public static void main(String[] args) {
    		//通过简单工厂来获取接口对象
    		Api api = Factory.createApi(1);
    		
    		
    		api.operation("正在使用简单工厂");
    	}
    }

    从上面的代码中Client中并没有直接去new一个 ImplA的实例对象,而是通过Factory工厂类去实现new一个ImplA类。这就相当于在Client类与ImplA类之间转换了一下,
    从而我们要创建什么对象。仅仅要在createApi()中的參数变一下就得到了对应的对象,详细的实现是封装在Factory类中,这样做的优点是以后系统维护和升级中假设要加入一个实例对象,仅仅要在Factory中加入对应的代码就可以,我们在外部调用就变的非常easy,通常还要做缓存,而不是每次都去new一个实例,详细的还要看项目需求了,
    
    

  • 相关阅读:
    onchange 事件
    JavaScript 声明全局变量和局部变量
    Window 对象 HTML框架标签(Frame)
    HTML DOM Document 对象
    JavaScript 对象
    HTML <frame> 标签的 src 属性
    HTML DOM open() 方法
    数据类型
    python
    angular 在formGroup中失效报错 ngModel cannot be used to register form controls with a parent formGroup directive
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7119425.html
Copyright © 2011-2022 走看看