静态工厂方法代替构造器

构造器创建对象示例

public Boolean(String b)
{
		this.toBoolean(b);
}

//创建对象
Boolean b = new Boolean("true");

静态工厂模式创建对象示例

public static Boolean valueOf(String s) 
{
        return toBoolean(s) ? TRUE : FALSE;
}
// 创建对象
Boolean b = Boolean.valueOf("true");

使用静态工厂方法体构造器的优点

  • 静态工厂方法有方法名,可读性强

构造方法可以有多个,但构造方法没有方法名,只能根据不同的参数列表确定的到的实例。但不查询文档基本上无法确定不同构造方法的作用

静态工厂方法也能有多个,但可以根据规范的方法名确定某个方法的用途。

public class MaxAndMin
{
    /**
     * 最小值
     */
    private int min = Integer.MIN_VALUE;
    
    /**
     * 最大值
     */
    private int max = Integer.MAX_VALUE;
    
    /**
     * 大于min 小于max
     * 
     * @param min
     * @param max
     */
    
    public MaxAndMin(int min, int max)
    {
        this.min = min;
        this.max = max;
    }
    
    public MaxAndMin(int min)
    {
        this.min = min;
    }
    
    /**
     * 大于min 小于max
     * 
     * @param min
     * @param max
     */
    public static MaxAndMin between(int min, int max)
    {
        return new MaxAndMin(min, max);
    }
    
    /**
     * 大于min 小于Integer.MAX_VALUE
     * 
     * @param min
     */
    public static MaxAndMin biggerThan(int min)
    {
        return new MaxAndMin(min, Integer.MAX_VALUE);
    }
    
    /**
     * 大于Integer.MIN_VALUE 小于max
     * 
     * @param max
     */
    public static MaxAndMin smallerThan(int max)
    {
        return new MaxAndMin(Integer.MIN_VALUE, max);
    }
}
  • 静态工厂方法调用时不需要实例化对象
//使用构造器
MaxAndMin  maxAndMIn = new MaxAndMin (1,10);
//使用静态工厂方法
MaxAndMin  maxAndMIn = MaxAndMin.between(1,10);
  • 静态方法可以放回元返回类型的所有子类
    public static Dog getInstance()
    {
        return new RedDog();//或者return new BlackDog();
    }
  • 静态方法代码更加简洁
class TestMap<K, V>
{
    public TestMap()
    {
        
    }
    
    public static <K, V> TestMap<K, V> newInstance()
    {
        return new TestMap<K, V>();
        
    }
    
}

// 调用构造方法
 TestMap<String, String> map1 = new TestMap<String, String>();
//更加简洁,不需要重复指明类型参数,可以自行推导出来
 TestMap<String, String> map2 = TestMap.newInstance();

使用静态工厂方法的缺点

  • 如果类不含public或protect的构造方法,将不能被继承;

可被继承:

class TestMap<K, V>
{
    public TestMap()
    {
        
    }
    
    public static <K, V> TestMap<K, V> newInstance()
    {
        return new TestMap<K, V>();
        
    }
    
}

不可以被继承:

class TestMap<K, V>
{
    privateTestMap()
    {

    }

    public static <K, V> TestMap<K, V> newInstance()
    {
        return new TestMap<K, V>();

    }

}
  • 与其它普通静态方法没有区别,没有明确的标识一个静态方法用于实例化类
    一般一个静态工厂方法需要有详细的注释,遵守标准的命名,如使用getInstance、valueOf、newInstance等方法名;

静态工厂方法和工厂方法模式的区别

  • 静态工厂方法:是某个类里的静态方法,通过调用该静态方法可以得到属于该类的一个实例
  • 工厂方法模式:是一种设计模式,指的是让具体的工厂对象负责生产具体的产品对象,这里涉及多种工厂(类),多种对象(类),如内存工厂生产内存对象,CPU工厂生产CPU对象
  • 如果要说相似的话,静态工厂方法跟简单工厂模式倒有那么点像,不过区别也挺大,简单工厂模式里的静态工厂方法会创建各种不同的对象(不同类的实例),而静态工厂方法一般只创建属于该类的一个实例(包括子类);

原文链接:https://www.cnblogs.com/chenpi/p/5981084.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值