1. 创建和销毁对象(1)

0
1. 考虑使用静态工厂方法代替构造器
优点:
1. 静态工厂方法拥有自己的名字,通过名字可以大概知道该方法实现了哪种功能;2.不需要在每次调用这些静态工厂方法的时候创建一个新的对象;3. 可以返回任何子类型的对象,例如int,long,String等等;4.在创建参数化类型实例的时候,使代码变得更加简洁。
缺点:
1.类如果不含公有的或者受保护的构造器,就不能被子类化,程序鼓励附和而不是继承。2. 和其他的静态方法实际上没有任何区别。
总结:静态工厂通常比较合适设计,因此切忌第一反应就是提供共有的构造器,而不先考虑静态工厂
2. 遇到多个构造器参数时要考虑构建器
构建器的作用:
1,增强代码的可读性及减少代码的维护成本;
2,减少设计一个类时构造方法的个数.
builder模式也有自身的不足,为了创建对象,必须先创建他的构建器。虽然构建器的开销在实践中不是那么明显,但是在某些十分注重性能的情况下,就会成为问题。builder模式还比重叠构造器模式更为冗长,因此只有在参数比较多的时候菜使用,例如4个或者更多。
3. 用私有构造器或者枚举类型强化单例模式属性(Singleton)
什么是单例模式:单例模式是一种比较常见的设计模式。
特定:1.单例类只能有一个实例。2. 单例类必须自己创建自己唯一的实例。3. 单例类必须给所有其他对象提供这一实例。
单例模式有懒汉式单例(延迟加载,线程不安全的,但是可以通过修改某些方法使其变得安全)和饿汉式模式(在类初始化的时候,就已经被实例化,所以一开始就是线程安全的),
懒汉式:

public class Singleton {
        //线程不安全
        private static Singleton singleton=null;
        private Singleton(){
        }
        public static Singleton getInstance(){
            if (singleton==null) {
                singleton=new Singleton();//通过这个方法实例化
            }
            return singleton;
        }
    }
为了让上面的懒汉式单例变得线程安全,有以下3中方法
1.在getInstance方法加上同步,但是缺点是会影响性能
public static synchronized Singleton getInstance(){
        if (singleton==null){
            singleton=new Singleton();
        }
        return singleton;
    }
2.双重检查锁定
    public static Singleton getInstance(){
        if (singleton==null){
            synchronized (Singleton.class) {
                if (singleton==null)
                    singleton=new Singleton();
            }
        }
        return singleton;
    }
3.静态内部类,推荐使用这种方法,线程安全
    private static class LazyHolder{
        private static final Singleton INSTANCE=new Singleton();
    }
    public static final Singleton getInstance(){
        return LazyHolder.INSTANCE;
    }
4.最新的建议是使用枚举来强化单例模式,特定是只需要编写一个包含单个元素的public enum Elvis{

INSTANCE;
}:

    private static final Singleton single=new Singleton();
    public static Singleton getInstance(){
        return single;
    }
4. 通过私有构造器强化不可以被实例化的能力
目的和作用:某些工具类,我们不想让他被实例化,实例对他没有任何意义。然而,在缺少显示构造器的情况下,编译器会自动提供一个共有的,无参的缺省构造器,对于用户来说,这个构造器和其他的构造器没有任何区别。
解决方法:我们只需要让这个类包含私有构造器,那么他就不能被实例化了。
eg:
    public class Test{
        private Test(){}
        .....
    }
副作用:使得一个类不能被子类化。所有的构造器都必须显示或隐式地调用超类构造器,在这种情况下,子类就没有可访问的超类构造器可以调用。

猜你喜欢

转载自blog.csdn.net/wsk1103/article/details/61450794
1.