设计模块之简单工厂

简单工厂模式:从名字来看 工厂:就是生产产品的,那么在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一个实例,详细的还要看项目需求了,



原文地址:https://www.cnblogs.com/zsychanpin/p/7119425.html