资讯专栏INFORMATION COLUMN

工厂模式和“万能”工厂类

LancerComet / 823人阅读

摘要:如下工厂类文件我们可以发现,通过工厂类的包装,在调用工厂类方法构造对象时可以十分轻松地完成任务,而后面的其他任务则交由工厂类的静态代码块完成。因此我们考虑把这部分代码写入工厂类,再生产过程前进行判断,过程封装进工厂类。

  

需要构造一个类的对象,我们通常会用new的方法来构造:

A a = new A();
  

但是如果随着这个对象被创建的同时还必须进行其他相对复杂的操作,那么在新建构造一个对象代码就显得非常复杂,这个复杂的代码通常还需要每一次都复写,大大增加了冗余。

因此我们构造了生产这个类对应对象的工厂,用工厂的方法来生产对象。
比如:我们需要在构造一个对象时并不知道这个对象中的某个字段的确切值,该值保存在配置文件中,所以每次构造对象都要进行配置文件的读取,依据配置文件中的内容来确定这个对象中该字段的信息,这个过程如果直接使用new来实现将会造成大量代码的冗余,大量冗余存在于配置文件的加载和读取,不妨把它封装成工厂类,在工厂类内部实现配置文件的加载和读取。

  

有如下配置文件:/src/config.properties:

ImportantString = OK
  

有如下预创建的对象所属类:/src/A.java:

public class A {
    private String Aname;
    public void Ashout(){
        System.out.println("I am "+Aname+",hahaha !");
    }
    public String getAname() {
        return Aname;
    }
    public void setAname(String aname) {
        Aname = aname;
    }
}
  

有如下测试文件:/src/Test.java:

public class Test{
    public static void main(String[] args) {
        A a = AFactory.getA();
        a.Ashout();
    }
}

则可以构造工厂类来生产该类的对象,生产过程中加载读取配置文件并将配置文件中的重要字段赋值给创建出的对象,并返回这个创建出的对象。

  

如下工厂类文件:/src/AFactory.java:

public class AFactory {
    private static Properties properties = null;
    private static String ANameToGet;
    private AFactory() {

    }
    static{
        try {
            properties = new Properties();
            properties.load(new FileReader(AFactory.class.getClassLoader().getResource("config.properties").getPath()));
            ANameToGet = properties.getProperty("ImportantString");
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    public static A getA(){
        A a = new A();
        a.setAname(ANameToGet);
        return a;
    }
}

我们可以发现,通过工厂类的包装,在调用工厂类方法构造对象时可以十分轻松地完成任务,而后面的其他任务则交由工厂类的静态代码块完成。

  

那么什么是万能工厂类呢?万能当然不是指能完成一切的工厂,而是说在很多情况下,我们可能需要构造各种类的对象,而这些对象在构造过程中可能也会完成很多跟构造相分离的相对复杂的任务,这些任务可能会导致前台代码冗余,而恰恰我们要构造的这些对象虽然分属不同的类却有结构相同的代码,这是我们不妨使用泛型来进一步解决这个问题。

以上面的例子为基础,我们需要两个类,在这两个类的对象的创建过程中都必须要检查配置文件中的一对Key是否相等,相等的Key才能允许对象的创建,
否则不允许创建,这个过程中如果在new之前直接做判断逻辑,将会导致大量的代码冗余,因为每个类的对象创建前都要进行相同的判断。因此我们考虑
把这部分代码写入工厂类,再生产过程前进行判断,过程封装进工厂类。
但是由于我们两个类的对象的生成实现过程类似,因此不需要分别写工厂,而是统一地写一个泛型化的工厂,依据传进的类的类型利用Class.forName(className).newInstance()来创建新的对象。

  

有如下配置文件:/src/config.properties:

Key1 = RightKey
Key2 = RightKey
  

有如下预创建的对象所属类:/src/A.java:

public class A {
}
  

/src/B.java:

public class B {
}
  

有如下测试文件:/src/Test.java:

public class Test{
    public static void main(String[] args) {
        A a = CommonFactory.getInstance();
        B b = CommonFactory.getInstance();
    }
}

则可以构造工厂类来生产该类的对象,生产过程中加载读取配置文件并将判断配置文件中的Key以确定对象是否能正常生成,如果可以返回这个创建出的对象。

  

如下工厂类文件:/src/CommonFactory.java:

public class CommonFactory {
    private static Properties properties = null;
    private static String Key1;
    private static String Key2;
    static boolean no;
    private CommonFactory() {
    }
    static{
        try {
            properties = new Properties();
            properties.load(new FileReader(CommonFactory.class.getClassLoader().getResource("config.properties").getPath()));
            Key1 = properties.getProperty("Key1");
            Key2 = properties.getProperty("Key2");
            no = Key1.equals(Key2);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    public static  T getInstance(Class clazz){
        try {
            String className = clazz.getName();
            if(no){
                T t = (T) Class.forName(className).newInstance();
                System.out.println(className+" Object Astablished Successfully");
                return t;
            }
            else
            {
                System.out.println(className+" Object Astablished failed");
                return null;
            }


        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64321.html

相关文章

  • php设计模式

    摘要:我们今天也来做一个万能遥控器设计模式适配器模式将一个类的接口转换成客户希望的另外一个接口。今天要介绍的仍然是创建型设计模式的一种建造者模式。设计模式的理论知识固然重要,但 计算机程序的思维逻辑 (54) - 剖析 Collections - 设计模式 上节我们提到,类 Collections 中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了...

    Dionysus_go 评论0 收藏0
  • php设计模式

    摘要:我们今天也来做一个万能遥控器设计模式适配器模式将一个类的接口转换成客户希望的另外一个接口。今天要介绍的仍然是创建型设计模式的一种建造者模式。设计模式的理论知识固然重要,但 计算机程序的思维逻辑 (54) - 剖析 Collections - 设计模式 上节我们提到,类 Collections 中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了...

    vspiders 评论0 收藏0
  • JavaScript工厂模式

    摘要:基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。工厂方法模式之所以又被称为多态工厂模式,是因为所有的具体工厂类都具有同一抽象父类。工厂方法模式总结工厂方法模式是简单工厂模式的进一步抽象和推广。 JavaScript工厂模式 首先需要说一下工厂模式。工厂模式根据抽象程度的不同分为三种 简单工厂模式 工厂方法模式 抽象工厂模式 1.简单工厂模式 简单工厂模式:又称为静态工厂方法...

    oujie 评论0 收藏0
  • PHP高级特性-反射Reflection以及Factory工厂设计模式的结合使用[代码实例]

    摘要:反射提供给面向对象编程可以自省的能力,即反射。在简单工厂模式中,根据传递的参数来返回不同的类的实例简单工厂模式又称为静态工厂方法模式。也就是简单工厂模式工厂工厂类。PHP高级特性-反射以及工厂设计模式的结合使用 [结合 Laravel-Admin 代码实例讲解]利用反射来实现工厂模式的生产而无需创建特定的工厂类本文地址http://janrs.com/?p=833转载无需经过作者本人授权转载...

    番茄西红柿 评论0 收藏2637
  • 设计模式学习笔记:工厂模式

    摘要:二简单工厂模式组成工厂类工厂模式的核心,通过调用它来实现其他类的功能。三工厂方法模式利用工厂方法模式可以有效解决简单工厂模式破坏开闭原则的问题。 一、概念 1、工厂模式分为三类:(1)简单工厂模式:一个工厂创建所有产品(2)工厂方法模式:一个工厂方法创建一个产品(3)抽象工厂模式:一个工厂方法创建一类产品 2、创建型模式这种模式是指将实例的创建和使用分离开来,隐藏类实例的创建细节,外界...

    luxixing 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<