`
dykl001
  • 浏览: 32995 次
  • 性别: Icon_minigender_1
  • 来自: 济南
最近访客 更多访客>>
社区版块
存档分类
最新评论

Effective Java对象创建(一)静态工厂方法代替构造函数

阅读更多

一、对象的创建
       第1条:考虑用静态工厂方法代替构造函数
              概念:所谓静态工厂方法(static factory method),实际上只是一个简单的静态方法,它返回的是类
                         的一  个实例。
              例子:pbulic static Boolean getBoolean()
                          {
                               return (Boolean.TRUE);
                          }
                优点:1、与构造函数相比,静态工厂方法可以具有一个具有意义的名字
                             2、与构造函数相比,每一次调用并不一定非要创建一个新的对象
                                   例子:
                                           class SingletonFactory
                                            {   // 可以看作全局唯一的变量
                                                  private static singletonfactory=new SingletonFactory();

                                                  private SingletonFactory()
                                                  {}

                                                  public static SingletonFactory getSingletonFactoryInstance()
                                                  {    
                                                      //这里并不是每次都返回一个新的对象,而是反复返回同一个对象
                                                        return singletonfactory;
                                                    }
                                             }
                               3、与构造函数不同,可以返回一个原返回类型的子类型的对象
                                       例子:
                                               Interface BaseInterface
                                                {
                                                        void printlns();
                                                }
                                                class BaseImp implements BaseInterface
                                                {
                                                         public BaseImp ()
                                                         {}
                                                         public void printlns()
                                                          {
                                                                  System.out.println("BaseImp's printlns method ");
                                                           }
                                                }

                                                abstract class SingletionFactory
                                                {
                                                      private static SingletionFactory singletionfactory;
                                                     private static String classname="";
                                                      private static Object object=new Object();

                                                      public static BaseInterface getBaseInterface()
                                                      {
                                                               if (singletionfactory==null)
                                                                {
                                                                     synchorinzed(obj){
                                                                          try
                                                                          {
                                                                                   singletionfactory=(SingletionFactory)Class.forNmae(
                                                                                   classname).newInstaance();
                                                                          }
                                                                          catch(ClassNotFoundException e)
                                                                          {
                                                                            
                                                                           }
                                                                     }
                                                                 }
                                                                return singletionfactory.createObject();
                                                       }
                                                        abstract BaseInterface createObject();
                                                }

                      缺点:
                          1、如果类没有public or protected 构造函数,不能子类化
                          2、与其他静态方法没有任何区别,静态工厂方法代表了一种对规范的背离


Coundy 2007-04-12 04:14 发表评论
分享到:
评论

相关推荐

    effective-java 配套代码

    3. **构造函数与工厂方法(Constructors and Factory Methods)**: 书中提倡使用工厂方法代替公共构造函数,以实现更好的封装和灵活性。这里可能包含不同类型的工厂模式实现。 4. **可变与不可变对象(Mutable vs ...

    Effective-Java读书笔记

    3. **优先考虑静态工厂方法而非构造器**:静态工厂方法比公有构造器更灵活,它们不需要在每次实例化时都创建一个新的类实例,还可以返回已缓存的实例或限制对象的创建。 4. **使用不可变对象**:不可变对象一旦创建...

    Java学习总结(2023/03/19)

    17. 使用私有静态工厂方法代替构造函数。 18. 优先考虑使用私有构造函数和公有工厂方法。 19. 使用私有构造函数实现不可实例化的工具类。 20. 使用枚举来实现Singleton模式。 21. 避免创建不必要的对象。 22. 使用...

    effecctivejava 第三版中文

    1. **构造器与工厂方法**:书中强调,类的构造器应该简洁且易于理解,同时推荐使用工厂方法来替代公开构造器,以提供更灵活的实例创建策略。 2. **枚举代替常量类**:枚举类型不仅提供了安全性和便利性,还能避免...

    Effecctive java 中文版

    9. **项9:使用静态工厂方法代替构造器** 静态工厂方法有命名自由、不需暴露构造器、可以返回原类型或子类型的实例等优势。 10. **项10:考虑提供一个无参构造器用于序列化** 序列化时,如果类没有无参构造器,...

    effective-java:Intellij IDEA 的有效 Java 模式重构

    3. **静态工厂方法(Static Factory Methods)**:这些方法优于公有构造函数,因为它们可以返回已存在的对象、返回子类型、具有更有意义的名称,甚至可以改变返回类型。在IntelliJ IDEA中,可以创建或重命名静态工厂...

    effectiveJava

    10. **用私有静态工厂方法代替构造函数** 这样可以避免子类化,并且可以控制对象的创建,比如进行资源管理或缓存实例。 11. **优先考虑不可变对象** 不可变对象更安全,线程安全,易于理解,且可以缓存。它们在多...

    EffectiveJava:有效的 Java 示例

    - **工厂方法**:提倡使用工厂方法来创建对象,以提高代码的灵活性和可扩展性。 - **建造者模式**:推荐使用建造者模式来构造复杂对象,避免长参数列表和可变构造函数。 2. **接口与抽象类** - **接口优先于抽象...

    现代编程语言- Kotlin 之美 - 当下最火的编程语言欣赏.pdf

    #### EJ 第1条:考虑使用静态工厂方法代替构造器 在实例化对象的过程中,静态工厂方法相较于构造器具有明显的优势。这些优势不仅限于易于理解和避免不必要的对象创建,还包括能够灵活地返回原类型的任何子类型。...

    effective-java:我正在关注Joshua Bloch撰写的有效Java一书

    2. **优先考虑静态工厂方法而不是构造器**:静态工厂方法不需创建新类实例即可返回对象,这在需要控制实例数量或者创建复杂对象时非常有用。 3. **重写`equals()`必须重写`hashCode()`**:确保当两个对象相等时,...

    effective-java:阅读《有效的Java》一书

    《有效的Java》是Java开发领域的一本经典著作,由Joshua Bloch撰写,它为Java程序员提供了一系列实用的编程准则和最佳实践。本书的核心理念是提高代码质量、可读性和可维护性,通过一系列条目介绍了如何编写更高效、...

    Clean-Code-Study:TDD,重构,有效的Java,设计模式,框架

    其中的一些关键点包括:使用枚举代替常量类,避免使用原始类型,利用泛型提升代码复用,以及善用静态工厂方法而非公有构造器等。这些原则有助于写出更高效、更安全的Java程序。 **设计模式** 设计模式是软件工程中...

Global site tag (gtag.js) - Google Analytics