A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如题,以工厂方法代替构造函数有什么好处?

3 个回复

倒序浏览
就是指,你在实例化子类的过程中用工厂方法,来代替显示的类型构造代码
所谓实例化子类,就是指一般来讲你会有一个统一个抽象类或接口,而这时

Person person = new Student();
不如用
Person person = Factory.getStudent();
这样的形式好

因为后一种形式,并不与具体的Student类型耦合。
松散耦合,才是良好的设计。

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 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中,返回类的唯一实现对象。

回复 使用道具 举报
{:soso_e108:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马