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();
    }
}
复制代码

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

查看所有标签

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

金字塔原理

金字塔原理

[美] 巴巴拉·明托 / 王德忠、张珣 / 民主与建设出版社 / 2002-12 / 39.80元

《金字塔原理》是一本讲解写作逻辑与思维逻辑的读物,全书分为四个部分。 第一篇主要对金字塔原理的概念进行了解释,介绍了如何利用这一原理构建基本的金字塔结构。目的是使读者理解和运用简单文书的写作技巧。 第二篇介绍了如何深入细致地把握思维的环节,以保证使用的语句能够真实地反映希望表达的思想要点。书中列举了许多实例,突出了强迫自己进行“冷静思维”对明确表达思想的重要性。 第三篇主要针对的......一起来看看 《金字塔原理》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具

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

正则表达式在线测试