通过例子来理解巧妙绝伦的工厂模式

每次读设计模式的书,都感觉自己收获颇多。《Head First 设计模式》在学校的时候就买下了,刚开始初学java的时候,经常问别人,设计模式有没有用,设计模式的好处在哪里。后来参加工作,在工作中慢慢体会到模式的重要性。在我的理解里,模式就是前人总结的经验,模式就是前人的智慧成果。借助模式,我们可以在解决问题的同时,提高代码的健壮性!

工厂模式是我们最常用的模式之一,定义不多说,一会直接举例子。先说说工厂模式中体现的一些OO原则:

1)解耦合

2)依赖抽象,不要依赖具体类

3)类应该对扩展开放,对修改关闭

我们在下面的例子中慢慢去体会上面的几个原则。这个例子来源于NFS-RPC,如下:

1)接口类

public interface ClientFactory {

	public static final long javaHeapSize = Runtime.getRuntime().maxMemory(); 
	
	public Client get(final String targetIP, String... customKey) throws Exception;


}

2)接口抽象类

public abstract class AbstractClientFactory implements ClientFactory {

	private static boolean isSendLimitEnabled = false;

	public Client get(final String targetIP, String... customKey) throws Exception {
		//实现代码省略
	}

	protected abstract Client createClient(String key);

}

3)工厂类

public class NettyClientFactory extends AbstractClientFactory {

	private static AbstractClientFactory _self = new NettyClientFactory();

	private ClientBootstrap bootstrap = null;
	
	private NettyClientFactory(){
		//初始化代码
	}
	
	public static AbstractClientFactory getInstance() {
		return _self;
	}
	
	protected Client createClient(String targetIP, String key) throws Exception {
		//实现逻辑
		return client;
	}
}


这一套设计下来,可以简单总结为:接口定义规范,抽象类实现部分共用规范,具体工厂类实现个性化规范。借助工厂模式,让我们的代码扩展变的更加容易,比如我们现在想添加一个mina的实现,我们只需要模仿NettyClientFactory来写就可以了。不知道大家注意没注意到,NettyClientFactory为单例的,所以我们又可以把上面的流程称为单例的工厂模式。createClient方法返回值为Client,Client的设计是一个多例的工厂模式,流程还是接口->抽象类->具体类,只不过具体类没有单例化而已。

你可能感兴趣的:(通过例子来理解巧妙绝伦的工厂模式)