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

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)设计一个factory (工厂) 类,完成输入、修改以及输出工厂基本信息的功能,以此理解类的定义,对象的定义和初始化,要求: A. 数据成员包括:工厂名称(name)、工厂注册码(registration_code)、注册资金(registered_capital)、产品数量(product_quantity)等,其中name为string类型,registration_code和product_quantity位整型,registered_capital为浮点型。 B. 公有成员函数包括:input_information(), update_information()和display_information()以及两个构造函数:默认构造函数、含四个参数的构造函数。input_information()用于输入信息,display_information() 用于输出信息,update_information() 用于修改信息。 C. 在main中分别用“默认构造函数+ input_information()”创建并初始化factory对象f1,用带参的构造函数定义factory对象f2,之后对每个对象调用display_information()显示对象信息,调用update_ information () 更新信息后再显示对象信息。 D. 将B中的若干个构造函数用使用默认实参值的构造函数代替,完成C。 (2)A. 思考:在类的构造函数中可以对类的静态数据成员初始化吗? B. 给factory增加一个静态成员变量next_code,在默认构造函数中用next_code对registration_code初始化,其余数据成员初始化为0或空。将factory类的定义放在factory.h中,将factory类的实现放在factory.cpp中,在main中用默认构造函数定义三个factory对象,调用display_information() 显示对象信息,以此理解并掌握静态数据成员,类的接口和实现的分离。
05-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值