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

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

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

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

工厂方法与简单工厂

对于简单工厂模式,我们知道其在工厂类中包含了必要的逻辑判断,根据不同的条件来动态实例化相关类。对于客户端来说,这去除了与具体产品的依赖;但于此同时也带来了一个问题:如果我们要增加产品,比如我们要生产苹果计算机,就需要在工厂类中添加一个 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();
    }
}
复制代码

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

查看所有标签

猜你喜欢:

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

啊哈C语言!逻辑的挑战(修订版)

啊哈C语言!逻辑的挑战(修订版)

啊哈磊 / 电子工业出版社 / 2017-1 / 49

《啊哈C语言!逻辑的挑战(修订版)》是一本非常有趣的编程启蒙书,《啊哈C语言!逻辑的挑战(修订版)》从中小学生的角度来讲述,没有生涩的内容,取而代之的是生动活泼的漫画和风趣幽默的文字。配合超萌的编程软件,《啊哈C语言!逻辑的挑战(修订版)》从开始学习与计算机对话到自己独立制作一个游戏,由浅入深地讲述编程的思维。同时,与计算机展开的逻辑较量一定会让你觉得很有意思。你可以在茶余饭后阅读《啊哈C语言!逻......一起来看看 《啊哈C语言!逻辑的挑战(修订版)》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具