简单工厂模式【读书笔记】

简单工厂模式并不是一个标准的设计模式,但是太常用了,所以来学习总结一下。

简单工厂的定义:

提供了一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型可以是借口、抽象类,也可以是对象的实例。

问题场景:

有个接口定义为Api,实现类为Impl,怎么在客户端使用这个接口?

接口:

package com.matrix1024.simplefactory;

public interface Api {
	
	/**
	 *  通过传入的不同语言,打印问候语
	 * @param language 语言类型
	 */
	public void sayHello(String language);
}

实现类:

package com.matrix1024.simplefactory;

public class Impl implements Api{

	@Override
	public void sayHello(String language) {
		System.out.println(language+":Hello,Simple Factory design pattern!");
	}
}

测试客户端:

package com.matrix1024.simplefactory;

/**
 * 客户端,用来测试Api接口
 * @author Matrix
 *
 */
public class Client {

	public static void main(String [] args) {
		Api api = new Impl();
		api.sayHello("English");
	}
}

测试结果如下:

English:Hello,Simple Factory design pattern!

看看上面的代码,我们发现:

Api api = new Impl();

客户端在调用接口的时候,已经知道了接口的具体实现就是Impl,接口的思想就是"封装隔离",所以实现类Impl应该是被封装好的,同时和客户端是隔离的,也就是说客户端不应该知道Api接口的具体实现。

但是如果不在Client里面具体实例实现类,该如何获得这个接口对象呢?

问题描述:

在java开发中,如果只知道接口而不知道实现?该怎么办呢?

解决上述问题的一个解决方法就是简单工厂模式。

简单工厂模式中,接口的实现已经完成,现在客户端只是知道接口,而不知道接口的具体实现,当出现多个实现类的时候,由工厂来完成”选择“职责。

增加一个接口实现类:

package com.matrix1024.simplefactory;

public class ChineseImpl implements Api {

	@Override
	public void sayHello(String language) {
		System.out.println(language+":你好,简单工厂模式!");
	}

}

简单工厂的实现类:

package com.matrix1024.simplefactory;

/**
 * 简单工厂模式
 * @author Matrix
 *
 */
public class SimpleFactory {

	/**
	 * 创建用户需要的api
	 * @param language 用户传入的需求
	 * @return
	 */
	public static Api CreateApi(String language) {
		
		Api api = null;
		if("Chinese".equals(language)){
			api = new ChineseImpl();
		}else{
			api = new Impl();
		}
		return api;
	}
}

由上面的代码我们可以看出:简单工厂的本质是选择实现。

实现类已经完成,简单工厂需要根据用户的需要(用户需要知道传入参数对选择实现的改变)去选择不同的实现类来满足用户的需要。

在简单工厂模式中,存在三个部分:Client,SimpleFactory,API(Implement Class)。

在这其中,simpleFactory和API对Client部分开放,Client知道传入参数和获得实现类的对应关系。

 

 

                                                                                                               ---《研读设计模式》读书笔记

posted @ 2012-05-21 23:42  matrix1024  阅读(289)  评论(0)    收藏  举报