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

原创 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 接口的对象

 

下面是服务提供者框架:

 

 

 

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

考虑静态构造方法这里的静态构造方法不等于设计模式中的工厂模式public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE...
  • guanhang89
  • guanhang89
  • 2016年06月07日 14:35
  • 740

Java中用静态工厂方法代替构造器的优缺点

Effective Java学习几笔,静态工厂方法的善用。 一般情况下,对于类而言,我们获取一个类的实例时,最常用的方法是提供一个公有的构造器。 但是还有一种方法,类可以提供一个公有的静态工厂方法,...
  • moyu123456789
  • moyu123456789
  • 2016年09月04日 00:31
  • 2253

《Effective Java》: 考虑用静态工厂方法代替构造函数

考虑用静态工厂方法代替构造函数类可以为它的客户提供一些静态工厂方法,来替代构造函数,或者同时也提供一些构造函数。  静态工厂方法的一个好处是,与构造函数相比,静态工厂方法具有名字,它可以使得代码更容易...
  • ferityCall
  • ferityCall
  • 2010年02月01日 18:54
  • 473

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

场景: 设想这样一种场景,有两种方式可以构造一个复数:第一种方式是通过实部和虚部的数字构造,第二中方式是通过半径和弧度构造,假设两种方式的参数类型都是float,不考虑精度问题。这样的话,因为参数类...
  • mark555
  • mark555
  • 2014年06月15日 10:51
  • 430

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

  优点:1.与构造函数不同,静态工厂方法具有名字。这个好处可以帮助我们摆脱一个类只能有一个原型相同的构造函数的限制。2.与构造函数不同,静态工厂方法每次被调用的时候,不要求非得创建一个新的对象(si...
  • weoln
  • weoln
  • 2008年12月07日 14:10
  • 1189

静态工厂方法代替构造器的总结

一、静态工厂方法与构造器不同的第一大优势在于,它们有名称。 1.方法的签名 (1)定义:方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。 (2)注意:不包括它的返回类型以及访问修饰符...
  • tscyds
  • tscyds
  • 2016年04月12日 23:44
  • 523

用静态工厂方法代替构造器

在effective java 中第一条提到用静态工厂方法代替构造器 优点如下: 1. 静态工厂方法有名字,构造器名字固定,不易于表达方法签名的意义 2. 不必在每次调用它们的时候都创建一...
  • topwqp
  • topwqp
  • 2015年08月05日 09:09
  • 1146

静态工厂方法

静态工厂方法是什么静态工厂方法的声明方式静态工厂方法的优势静态工厂方法的劣势静态工厂方法的争议  静态工厂方法与构造器不同的第一大优势在于:他们有名 静态工厂方法与构造器不同的第二大优势在于:...
  • qq1071946724
  • qq1071946724
  • 2013年12月19日 14:54
  • 1246

考虑用静态工厂方法代替构造器

这里讲的静态工厂方法和设计模式中的
  • u013444880
  • u013444880
  • 2014年10月31日 11:24
  • 262

第一条:用静态工厂方法代替构造器

所谓静态工厂方法,实际上只是一个简单的静态方法,它返回的是类的一个实例。特点就是构造方法是私有的。 静态工厂方法有四大优势: 优势1.静态工厂方法的名称,因此比构造器更准确地描述返回的实例。pub...
  • yanjie415876780
  • yanjie415876780
  • 2016年01月01日 20:59
  • 223
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用静态工厂方法代替构造函数
举报原因:
原因补充:

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