用静态工厂方法代替构造函数

原创 2012年03月28日 21:18:40
package EffectiveJava;

import java.util.HashMap;
import java.util.Map;
import static java.lang.System.out;
interface Service{
	//里面可以提供操作服务的方法
	void say();
}
// 提供都接口,其提供一个返回服务的方法
interface Provider{
	Service newService();// 返回服务的方法
}
class Services{
	private Services() {}
	// 提供一个注册服务、取得 服务的依法
	private static Map<String,Provider> providers = new HashMap<String,Provider>();
	public static final String DEFAULT = "DEFAULT";
	public static void registerProvider(String name,Provider provider)
	{
		providers.put(name, provider);
	}
	public static Service newInstance(String name) {
		Provider p = providers.get(name);
		if(p == null)
			throw new IllegalArgumentException(name+" not register");
		return p.newService();
	}
	public static Service newInstance() {
		 return providers.get(DEFAULT).newService();
	}
}
public class ProviderService  {
	
	private  static Provider CLOSE = new Provider() { // 定义一个provider,用于提供服务
		@Override
		public Service newService() { // 重写provider 接口里的方法
			return new Service() { // 返回一个Service接口的匿名内
				public void say() {
					out.println("CLOSE Service alreay loading...");
				}
			};
		}
	};
	private static Provider JUMP = new Provider() {
		public Service newService() {
			
			return new Service() {
				public void say() {
					out.println("JUMP Service alreay loading...");
				}
			};
		}
	};
	public static void main(String argsp[]) {
		Services.registerProvider("close", CLOSE);
		Services.registerProvider("jump", JUMP);
		Services.newInstance("close").say();
		Services.newInstance("jump").say();
		
	}
}
/*
 * 		服务提供者框架	
 * 			Service :服务接口
 * 			Provider:提供者接口,用于提供服务,有一个得到服务的方法
 * 			Services:提供服务类,给定String服务名,得到其相应的服务
 * 		因为是给定String 名,得到相应的服务对象,可以得到反射得到相应的类再实例化,也可以在
 * 		Services 类中维护一个Map<String,Provider> 的映射表,在得到一个服务之前要注册,也就是map.put(String),
 * 		放进注册中,在得到newInstance的时候,再map.get(String) 就行
 * 		从里面得到相应的Provider,再求得其
 * 		提供的服务对象
 * */


用静态工厂方法代替构造函数的优点

 

1.不一定要创建对象

2.可以返回指定类型的对象,如果返回集合类时,我们可以返回一个Collection 接口的对象

 

下面是服务提供者框架:

 

 

 

相关文章推荐

十月读书笔记:Effective Java(一)--静态工厂方法及私有化构造函数

简述: 《Effective Java》是Joshua Bloch所著,Joshua是Sun公司的高级工程师,他也是我们所熟知的JAVA开发工具包中java.math和Java Collection...

JS中工厂方法和构造函数创建的对象的关系

通过工厂方法和构造函数创建对象的方式和区别。 // 工厂模式创建对象 // 缺点是不能指出实例之间的关系。 function creatPerson...

【Effective Java】Ch2_创建销毁对象:Item1_考虑用工厂方法替代构造函数

本章的主题是创建和销毁对象:何时创建、怎样创建;何时应该避免创建、如何避免创建;如何确保对象适时被销毁;如何管理对象销毁前的清理动作。         一个类如果要允许客户获得其实例,常用方法是提...

Effective Java 中文版之学习 第1条:考虑用静态工厂方法代替构造器

对于类而言为了让客户端获取自身的一个实例,最常用的方法就是提供一个公有的构造器。还有一种方法就是,类可以提供一个公有的静态工厂方法(static factory method),它只是返回类的实例的静...
  • gjk6913
  • gjk6913
  • 2017年03月29日 12:15
  • 156

创建和销毁对象 - 考虑用静态工厂方法代替构造器

知识点: 1.静态工厂方法 2.静态工厂方法代替构造器的优势 3.静态工厂方法代替构造器的劣势 1.静态工厂方法   一个静态方法,这个方法不做别人事,只用来创建对象。 文中提到了工...

Effective Java 1:考虑使用静态工厂方法代替构造器

最近在看Effective Java,第一条是考虑使用静态工厂方法代替构造器。优点 静态工厂方法与构造方法不同的是它们有方法名称 不必每次调用它们的时候创建一个新的对象 它们的返回类型可以是任何子类型...

[Effective Java]考虑用静态工厂方法代替构造器

本文主要介绍如何使用静态工厂方法已经在那种场合来使用这种方式代替构造方法。 众所周知,对于类而言,我们为了获得一个类的实例对象,通常情况下会提供一个公有的(public) 的构造器。当...
  • canlets
  • canlets
  • 2014年05月21日 20:49
  • 1229

Effective Java 学习笔记 使用静态工厂方法代替构造器

什么是使用静态工厂方法代替构造器:创建一个静态方法,返回值是类的实例 使用静态工厂方法的好处总结: 1.可以隐藏构造方法,把控对象的创建。可以让对象是单例,复用已经有的对象,比如Boolean  ...

1. 【创建与销毁对象】考虑用静态工厂方法代替构造器

本文是《Effective Java》的读书笔记。简要介绍了静态工厂方法的应用场景和优缺点,以便对这种技巧有更加全面的认识。...
  • get_set
  • get_set
  • 2015年12月30日 21:43
  • 308

1、考虑用静态工厂方法代替构造器(effective java)

考虑静态构造方法这里的静态构造方法不等于设计模式中的工厂模式public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用静态工厂方法代替构造函数
举报原因:
原因补充:

(最多只允许输入30个字)