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

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

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();
        }


    }

    



}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值