Java设计模式之工厂方法模式

栏目: Java · 发布时间: 7年前

内容简介:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。对于简单工厂模式,我们知道其在工厂类中包含了必要的逻辑判断,根据不同的条件来动态实例化相关类。对于客户端来说,这去除了与具体产品的依赖;但于此同时也带来了一个问题:如果我们要增加产品,比如我们要生产苹果计算机,就需要在工厂类中添加一个

定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。

工厂方法与简单工厂

对于简单工厂模式,我们知道其在工厂类中包含了必要的逻辑判断,根据不同的条件来动态实例化相关类。对于客户端来说,这去除了与具体产品的依赖;但于此同时也带来了一个问题:如果我们要增加产品,比如我们要生产苹果计算机,就需要在工厂类中添加一个 Case 分支条件,这违背了开放封闭原则,对修改也开放了。而工厂方法模式就没有违背这个开放封闭原则。如果我们需要生产苹果电脑,则无需修改工厂类,直接创建产品即可。

角色

  • Product :抽象产品类。
  • ConcreteProduct :具体产品类,实现 Product 接口。
  • Factory :抽象工厂类,该方法返回一个 Product 类型的对象。
  • ConcreteFactory :具体工厂类,返回 ConcreteProduct 实例。

工厂方法模式的简单实现

  1. 首先创建一个计算机的抽象产品类,其中有一个抽象方法用户启动计算机生产:
public abstract class Computer {
    /**
     * 产品的抽象方法,由具体的产品类实现
     */
    public abstract void start();
}
复制代码
  1. 接着我们创建各个品牌的计算机,其都继承了自己的父类 Computer ,并实现了父类的 start 方法。
public class LenovoComputer extends Computer {

    @Override
    public void start() {
        System.out.println("联想计算机启动");
    }
}

public class HpComputer extends Computer {
    @Override
    public void start() {
        System.out.println("惠普计算机启动");
    }
}

public class AsusComputer extends Computer {
    @Override
    public void start() {
        System.out.println("华硕计算机启动");
    }
}
复制代码
  1. 创建抽象工厂类,里面有一个 createComputer 方法,用于生产各种品牌的计算机。
public abstract class ComputerFactory {
    public abstract <T extends Computer> T createComputer(Class<T> clz);
}

复制代码
  1. 创建具体工厂,广大代工厂是一个具体的工厂,其继承抽象工厂,通过反射来生产不同厂家的计算机。
public class GDComputerFactory extends ComputerFactory {
    @Override
    public <T extends Computer> T createComputer(Class<T> clz) {
            Computer computer = null;
            String className = clz.getName();
        try {
            //通过反射来生产不同厂家的计算机
            computer = (Computer)Class.forName(className).newInstance();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) computer;
    }
}
复制代码
  1. 客户端调用,客户端创建 GDComputerFactory 生产各种计算机。
public class Client {
    public static void main(String[] args) {
        ComputerFactory computerFactory = new GDComputerFactory();

        LenovoComputer mLenovoComputer = computerFactory.createComputer(LenovoComputer.class);
        mLenovoComputer.start();

        HpComputer mHpComputer = computerFactory.createComputer(HpComputer.class);
        mHpComputer.start();

        AsusComputer mAsusComputer = computerFactory.createComputer(AsusComputer.class);
        mAsusComputer.start();
    }
}
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

模糊数学基础及实用算法

模糊数学基础及实用算法

李鸿吉编 / 科学出版社 / 2005-1 / 55.00元

本书开发了模糊数学常用的计算机程序,并以大量的算例系统地介绍了模糊数学的实用算法。本书可以作为模糊数学的应用程序包,在详细解释源代码的同时,对应用程序开发所用到的Visual Basic 6.0方法做了系统介绍,其目的是为读者做进一步的自主开发提供便利。本书所提供的源程序可以作为读者自主开发的素材。本书配有光盘,分章节提供程序源代码。 本书可以作为大专院校、培训班的教学参考书。对需......一起来看看 《模糊数学基础及实用算法》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试