1、考虑使用静态工厂方法代替构造函数。

考虑使用静态工厂方法代替构造函数。
 
一、静态方法的一个好处是,与构造函数不同,静态方法具有名字。
       使用场合:
1、方法名字和参数列表组合,可明确的表达被创建对象的状态。构造函数却无此效果。
2、如果有多个构造函数,且有相同的原型,则可使用之避免重复。
二、静态方法的第二个好处是,与构造函数不同,他们每次被调用的时候,不要求非的创建一个新的对象。
       使用场合:
              1、可缓存被构造好的对象,避免每次都去创建对象的性能开销。如,单例模式。
              2、可控制类实例的存在。如,使非可变类不会有两个相等的实例子存在。
三、静态方法的第三个好处是,与构造函数不同,他们可以返回一个返回类型的子类型的对象。
1、待返回的子类和其接口类(作为函数返回类型)结合,可隐藏实现细节,并且迫使客户通过接口来引用被返回的对象。
       2、根据属性参数,可动态返回接口的不同实现类,从而提供软件灵活性。
       应用:Jivi中的论坛工厂实现:
private static String className = "com.jivesoftware.forum.database.DbForumFactory";
 
          public static ForumFactory getInstance(Authorization authorization) {
        //If no valid authorization passed in, return null.
        if (authorization == null) {
            return null;
        }
        if (factory == null) {
            synchronized(initLock) {
                if (factory == null) {
                    // Note, the software license expressely forbids
                    // tampering with this check.
                    //LicenseManager.validateLicense("Jive Forums Basic", "2.0");
 
                     String classNameProp =
                        JiveGlobals.getJiveProperty("ForumFactory.className");
                    if (classNameProp != null) {
                        className = classNameProp;
                    }
                    try {
                        //Load the class and create an instance.
                        Class c = Class.forName( className);
                        factory = (ForumFactory)c.newInstance();
                    }
                    catch (Exception e) {
                        System.err.println("Failed to load ForumFactory class "
                            + className + ". Jive cannot function normally.");
                        e.printStackTrace();
                        return null;
                    }
                }
            }
        }
        //Now, create a forum factory proxy.
         return new ForumFactoryProxy(authorization, factory,
                factory.getPermissions(authorization));
    }
四、静态方法的主要缺点是,类如果不含公有的或受保护的构造函数,就不能被子类化。
五、静态方法的第二个缺点是,他们与其他的静态方法没任何区别。
 
习惯命名:
1、  valueOf 实现一些有效的类型转换操作。如:Integer Integer.valueOf(int i);
2、  getInstance() 返回类的实现对象。在singleton中,返回类的唯一实现对象。
 
(1)设计一个factory (工厂) 类,完成输入、修改以及输出工厂基本信息的功能,以此理解类的定义,对象的定义和初始化,要求: A. 数据成员包括:工厂名称(name)、工厂注册码(registration_code)、注册资金(registered_capital)、产品数量(product_quantity)等,其中name为string类型,registration_code和product_quantity位整型,registered_capital为浮点型。 B. 公有成员函数包括:input_information(), update_information()和display_information()以及两个构造函数:默认构造函数、含四个参数的构造函数。input_information()用于输入信息,display_information() 用于输出信息,update_information() 用于修改信息。 C. 在main中分别用“默认构造函数+ input_information()”创建并初始化factory对象f1,用带参的构造函数定义factory对象f2,之后对每个对象调用display_information()显示对象信息,调用update_ information () 更新信息后再显示对象信息。 D. 将B中的若干个构造函数使用默认实参值的构造函数代替,完成C。 (2)A. 思考:在类的构造函数中可以对类的静态数据成员初始化吗? B. 给factory增加一个静态成员变量next_code,在默认构造函数中用next_code对registration_code初始化,其余数据成员初始化为0或空。将factory类的定义放在factory.h中,将factory类的实现放在factory.cpp中,在main中用默认构造函数定义三个factory对象,调用display_information() 显示对象信息,以此理解并掌握静态数据成员,类的接口和实现的分离。
最新发布
05-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值