1.对象性能模式概念:面向对象很好地解决了“抽象”的问题,但是必不可免地要付出一定的代价。对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。
2.单件模式 Singleton
动机:在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。
方式:声明私有的构造以及拷贝构造,设置静态变量和成员函数,并且仅在成员变量为空时进行新的构造,其余皆返回已构造的静态对象。当然这只在单线程适用,多线程非安全。使线程安全的解决方案:1.给成员的构造加锁,可以解决,但是锁的成本较高。2.双检查锁,先检查一次再加锁后再检查。但是其内存读写reorder不安全,导致双检查锁失效。(reorder指先分配内存再执行构造器,让静态对象不为空,但是并没有构造出对象)。解决办法:加volatile关键字,告诉编译器这句语句不进行优化,避免reorder。
单件模式定义:保证一个类仅有一个实例,并提供一个该实例的全局访问点。
总结:Singleton模式中的实例构造器可以设置为protected以允许子类派生。Singleton模式一般不要支持拷贝构造函数和Clone接口,因为这有可能导致多个对象实例,与Singleton模式的初衷违背。如何实现多线程环境下安全的Singleton?注意对双检查锁的正确实现。
3.享元模式Flyweight
动机:在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。
享元模式定义:运用共享技术有效地支持大量细粒度的对象。(例如线程池进程池等)
总结:面向对象很好地解决了抽象性的问题,但是作为一个运行在机器中的程序实体,我们需要考虑对象的代价问题。Flyweight主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。Flyweight采用对象共享的做法来降低系统中对象的个数从而降低细粒度对象给系统带来的内存压力。在具体实现方面,要注意对象状态的处理。对象的数量太大从而导致对象内存开销加大——什么样的数量才算大?这需要我们仔细的根据具体应用情况进行评估,而不能凭空臆断。