工厂设计模式

来源:互联网 发布:采购数据分析报告范本 编辑:程序博客网 时间:2024/06/05 00:18

工厂设计模式

工厂设计模式(Factory Pattern)是Java中最常用的设计模式之一。属于创建型模式,工厂设计模式提供了一种创建对象的最佳方式。

方式一:使用new关键字进行对象的实例化操作。

优点:
1.一个调用者想创建一个对象,只要知道其名称就可以了。
2.屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂。

代码实现

// 定义接口interface Fruit{    public void eat();}// 创建实现接口的实体类class Apple implements Fruit{    // 覆写接口方法    public void eat()    {        System.out.println("吃苹果.");    }}// 创建一个工厂,生成基于给定信息的实体类的对象。class Factory{    public static Fruit getInstance(String className)    {        if("Apple".equals(className))        {            return new Apple();        }        return null;    }}// 测试类public class TestDemo{    public static void main(String [] args)    {        Fruit f = Factory.getInstance("Apple");        f.eat();    }}

程序运行结果:
吃苹果

通过此程序可以发现,主方法不再和具体的子类耦合在一起了,其中间经历了一个过度,主方法中的操作越简单了。但是存在一个问题:如果添加了新的子类,需要修改Factory类.如添加如下子类:

class Pear implements Fruit{    public void eat()    {        System.out.println("吃梨.");    }}

那么Factory类应修改如下:

// 工厂类的实现class Factory{    public static Fruit getInstance(String className)    {        if("Apple".equals(className))        {            return new Apple();        }        if("Pear".equals(className))        {            return new Pear();        }        return null;    }}

使用方式二实现的工厂类可以避免这个问题。

方式二:使用反射机制实例化对象。

在使用反射机制实例化对象之前,先简要的说明一下反射机制:Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。

Java 反射机制主要提供了以下功能:
1.
2.
3.
4.
在java的反射机制中,Class类是所有反射操作的源头。下面主要简要介绍如何获得Class类对象,以及通过所取得的Class类对象完成对象的实例化。
获得Class类对象:使用Class内部定义的pulbic static Class<?> forName(String className)throws ClassNotFoundException方法
通过反射实例化对象:使用Class内部定义的public T newInstance() throws InstantationExceptio,IllegalAccessException方法


class Test{    @Override    public String toString(){        return "Test类对象.";    }}public class TestDemo{    public static void main(String [] args)throws Exception{        // 获得Class类对象        Class<?> cls = Class.forName("Test");        // 使用Class类对象实例化Test类对象        Object obj = cls.newInstance();        // 向下转型        Test test = (Test)obj;        System.out.println(test.toString());    }}

程序运行结果:
Test类对象.


现在可以发现,对于对象的实例化操作,除了使用new关键字之外又多了一个反射机制操作。下面使用反射机制操作完成工厂设计模式。


// 定义接口interface Fruit{    public void eat();}// 创建实现接口的实体类class Apple implements Fruit{    // 覆写接口方法    public void eat()    {        System.out.println("吃苹果.");    }}// 创建一个工厂,生成基于给定信息的实体类的对象。class Factory{    public static Fruit getInstance(String className)    {        Fruit f = null;        try        {            // 获取Class类对象            Class<?> cls = Class.forName(className);            // 使用Class类对象完成对象实例化操作            f = (Fruit)cls.newInstance();        }        catch(Exception e)        {            e.printStackTrace();        }        return f;    }}// 测试类public class TestDemo{    public static void main(String [] args)    {        Fruit f = Factory.getInstance("Apple");        f.eat();    }}

程序运行结果:
吃苹果.


这时候即使增加了接口的子类,工厂类照样可以完成对象的实例化操作,这才是真正的工厂类,可以应对所有的变化。如下添加Pear子类,那么主方法要实例化Pear子类对象,只需作改变工厂类getInstance()方法的参数,而不需要需改工厂类。

// 创建实现接口的实体类class Pear implements Fruit{    // 覆写接口方法    public void eat()    {        System.out.println("吃梨.");    }}// 主方法public static void main(String [] args)    {        Fruit pear = Factory.getInstance("Pear");        Fruit apple = Factory.getInstance("Apple");        pear.eat();        apple.eat();    }

程序运行结果:
吃梨.
吃苹果.

0 0
原创粉丝点击