打字猴:1.70045776e+09
1700457760 //获得无参构造
1700457761
1700457762 Constructor constructor=cl.getDeclaredConstructor();
1700457763
1700457764 //设置无参构造是可访问的
1700457765
1700457766 constructor.setAccessible(true);
1700457767
1700457768 //产生一个实例对象
1700457769
1700457770 singleton=(Singleton)constructor.newInstance();
1700457771
1700457772 }catch(Exception e){
1700457773
1700457774 //异常处理
1700457775
1700457776 }
1700457777
1700457778 }
1700457779
1700457780 public static Singleton getSingleton(){
1700457781
1700457782 return singleton;
1700457783
1700457784 }
1700457785
1700457786 }
1700457787
1700457788 通过获得类构造器,然后设置访问权限,生成一个对象,然后提供外部访问,保证内存中的对象唯一。当然,其他类也可以通过反射的方式建立一个单例对象,确实如此,但是一个项目或团队是有章程和规范的,何况已经提供了一个获得单例对象的方法,为什么还要重新创建一个新对象呢?除非是有人作恶。
1700457789
1700457790 以上通过工厂方法模式创建了一个单例对象,该框架可以继续扩展,在一个项目中可以产生一个单例构造器,所有需要产生单例的类都遵循一定的规则(构造方法是private),然后通过扩展该框架,只要输入一个类型就可以获得唯一的一个实例。
1700457791
1700457792 4.延迟初始化
1700457793
1700457794 何为延迟初始化(Lazy initialization)?一个对象被消费完毕后,并不立刻释放,工厂类保持其初始状态,等待再次被使用。延迟初始化是工厂方法模式的一个扩展应用,其通用类图如图8-6所示。
1700457795
1700457796
1700457797
1700457798
1700457799 图8-6 延迟初始化的通用类图
1700457800
1700457801 ProductFactory负责产品类对象的创建工作,并且通过prMap变量产生一个缓存,对需要再次被重用的对象保留,Product和ConcreteProduct是一个示例代码,请参考代码清单8-8和代码清单8-9。ProductFactory如代码清单8-22所示。
1700457802
1700457803 代码清单8-22 延迟加载的工厂类
1700457804
1700457805 public class ProductFactory{
1700457806
1700457807 private static final Map<String,Product>prMap=new HashMap();
1700457808
1700457809 public static synchronized Product createProduct(String type)throws Exception{
[ 上一页 ]  [ :1.70045776e+09 ]  [ 下一页 ]