用静态工厂方法代替构造方法
1.静态工厂方法与构造器不同的第一大优势在于,它们有名称
这有利于提高代码的可读性,列如:
User(indt a,int b){
this.a=a;
this.b=b
System.out.println("初始化:"+a+b);
}
//静态工程方法
public static Integer add(int a, int b){
return a+b;
}
我们用User(int a,int b)显然不能直到我们要干什么,返回的是什么加减还是其他什么的。
而当我们调用User.add(int a,int b)显然我们可以知道做加法;
2.静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新的对象
这使得不可变类可以使用预先构建好的实列,或者将构建好的实列缓存起来,进行重复利用,从而避免创建不必要的重复对象。User.add(int a,int b)方法说明了这项技术:它从来不创建对象。
静态工厂方法能够为重复的调用返回相同对象,这样有助于类总能严格控制在某个时刻哪些实例应该存在。
public class People {
private String sex="男";
private String appearance="一般";
private String asset="富";
//静态工厂方法
public static People createGirlfriend(){
//这里是可以空的
People people=new People();
people.sex="女";
people.appearance="倾国倾城";
people.asset="市中心十栋楼";
return people;
}
@Override
public String toString() {
return "People{" +
"sex='" + sex + '\'' +
", appearance='" + appearance + '\'' +
", asset='" + asset + '\'' +
'}';
}
public static void main(String[] args) {
People people=People.createGirlfriend();
System.out.println(people);
}
}
3.静态工厂方法与构造器不同的第三大优势在于,它们可以返回类型的任何子类型的对象
//静态工厂方法
public static People createChildren(){
Children perople =new Children();
return perople;
}
不过这里我们不得不提一下设计原则–里式替换原则:任何基类可以出现的地方,子类一定可以出现。 --百度百科
4.静态工厂方法与构造器不同的第四大优势在于所返回的对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值。
public static People createGirlfriend(int timeForSinge){
/*
* 根据所传参数,返回不同的子类对象
* */
if (timeForSinge<5){
EighteenBeauty eighteenBeauty=new EighteenBeauty();
return eighteenBeauty;
}else {
/*
* 单身超过五年,看男生都很清秀
*
* */
Man man=new Man();
return man;
}
}
5.静态工厂的第五大优势在于,方法返回的对象所属的类,在编写包含静态工厂方法的类可以不存在
服务提供者框架包含要去实现的接口
服务提供者接口:生成服务接口实例的工厂对象(就是用来生成服务接口的)
提供者注册API:根据客户端指定的某种条件去实现对应的服务提供者
import java.util.HashMap;
import java.util.Map;
/**
* @Author :张国军
* @Date :Created in 21:22 2020/12/10
* @Description : untitled2
**/
public class Service {
// 四大组成之一:服务接口
//登录服务
public interface LoginService{
void login();
}
public interface Provider{
/*
* Provider接口:服务提供者接口
* 登录服的提供者。同俗说就是:通过这个newLognService()可以获得一个服务
* */
public LoginService newLogService();
}
public static class ServiceManager{
private static final Map<String ,Provider> providers=new HashMap<String, Provider>();
private ServiceManager(){
}
//四大组成之三,服务提供者注册API(其实很简单 就是注册一个服务提供者)
public static void registerProvider(String name,Provider provider){
providers.put(name,provider);
}
//四大组成之四: 服务访问API (客户端只需要提供一个name参数 系统会去匹配服务提供者 然后提供服务)
public static LoginService getService(String name) throws IllegalAccessException {
Provider provider=providers.get(name);
if (provider==null){
throw new IllegalAccessException("No provider regostered with name"+name);
}
return provider.newLogService();
}
}
}