设计模式学习笔记1—简单工厂

设计模式学习笔记1—简单工厂

1.简介 

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

这个模式不是GoF著作中的。

2.简单实例

#接口Talk.java#

 

package com.designmode.unit1.simplefactory;

public interface Talk {
	void sayHello();
}
 

 

#实现类BritishTalk.java#

 

package com.designmode.unit1.simplefactory;

public class BritishTalk implements Talk{
	@Override
	public void sayHello() {
		System.out.println("Hello!");
	}
}
 

 

#实现类ChineseTalk.java#

 

package com.designmode.unit1.simplefactory;

public class ChineseTalk implements Talk{
	@Override
	public void sayHello() {
		System.out.println("你好!");
	}
}
 

 

#简单工厂TalkFactory.java#

 

package com.designmode.unit1.simplefactory;

import java.util.HashMap;
import java.util.Map;

public class TalkFactory {

	//获得本地语言
	private static String lang = System.getProperty("user.language");
	//存放语言和对应Talk实现类的map
	private static Map<String, String> langTalkMap = new HashMap<String, String>();
	static {
		langTalkMap.put("zh", ChineseTalk.class.getCanonicalName());
	}

	public static Talk createTalk() {
		//根据本地语言获得对应时限类的全路径
		String clsName = langTalkMap.get(lang);
		if (clsName != null) {
			try {
				//反射创建实例
				return (Talk) Class.forName(clsName).newInstance();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		//默认返回实现对象
		return new ChineseTalk();
	}
}
 

 

#客户端Client.java#

 

 

package com.designmode.unit1.simplefactory;

public class Client {
	public static void main(String[] args) {
		TalkFactory.createTalk().sayHello();
	}
}
 

 

3.优点

解耦:

使用简单工厂TalkFactory将具体创建Talk实例的实现工作从Client中抽离出来了。这里TalkFactory.createTalk()创建的实例是什么是由本地语言决定的,我们也可以读配置文件、数据库等来决定怎么选择Talk的实现。

 

帮助封装:

让组件外部能真正面向接口编程。

 

4.简单工厂本质:选择实现

    简单工厂的重点在选择,而不是实现,实现是已经做好了的。

 

5.何时选用简单工厂

想要完全封装隔离具体实现,让外部只能通过接口来操作封装体;

想要把对外创建对象的职责集中管理和控制,可以选用简单工厂。

 

6.相关模式

  • 简单工厂模式和抽象工厂模式

简单工厂是用来选择实现的,可以选择任意接口的实现。可以有多个用于选择并创建对象的方法,这些方法间可以有也可以没有关系;

抽象工厂模式是用来选择产品簇的实现的,即抽象工厂中多个方法所创建的对象之间通常是有关系的;

 

  • 简单工厂模式和工厂方法模式

工厂方法模式的本质也是用来选择实现的,不同的是它是把具体选择实现的功能延迟到子类去实现。

 

  • 简单工厂和创建型模式

简单工厂的本质是选择实现,因此可以和其他任何能够创建具体对象的模式配合使用,如单例、原型、生成器模式等。

 

7.参考书籍

  • 研磨【设计模式】

你可能感兴趣的:(设计模式)