美文网首页Android进阶之光设计模式设计模式
设计模式(十)工厂方法模式

设计模式(十)工厂方法模式

作者: 刘望舒 | 来源:发表于2016-08-27 15:08 被阅读219次

前言

在此前的设计模式(四)简单工厂模式中我们介绍了简单工厂模式,在这篇文章中我们来介绍下工厂方法模式,它同样是创建型设计模式,而且又有些类似,文章的末尾会介绍他们之间的不同。

1.工厂方法模式简介

工厂方法模式定义

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

工厂方法模式UML图

找了下网上的UML图,都画的丑丑的,自己画吧,结果就出来这么一个更丑的UML图:

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

2.工厂方法模式简单实现

参考设计模式(四)简单工厂模式这篇文章,我接着举电脑生产的例子。

创建抽象产品

电脑产品类,它有一个start方法用于启动电脑:

public abstract class Computer{
    public abstract void 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("华硕电脑启动");
    }
}

创建抽象工厂

里面有一个createComputer方法,想生产哪个品牌的电脑就生产那个:

public abstract class ComputerFactory {
    public abstract <T extends Computer> T createComputer(Class<T> clz);
}

具体工厂

广达代工厂是一个具体的工厂,他继承抽象工厂,通过反射来生产不同厂家的电脑:


/**
 * 广达代工厂
 */
public class GDComputerFactor 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 (Exception e) {
            e.printStackTrace();
        }
        return (T) computer;
    }
}

客户端调用

public class Client {
    public static void main(String[]args) {
        ComputerFactory computerFactory = new GDComputerFactor();
        LenovoComputer mLenovoComputer=computerFactory.createComputer(LenovoComputer.class);
        mLenovoComputer.start();
        HpComputer mHpComputer=computerFactory.createComputer(HpComputer.class);
        mHpComputer.start();
        AsusComputer mAsusComputerr=computerFactory.createComputer(AsusComputer.class);
        mAsusComputerr.start();
    }
}

结构很简单,看看下面的UML图就更加容易理解了:

3.工厂方法与简单工厂

简单工厂模式我们都知道,在工厂类中包含了必要的逻辑判断,根据不同的条件来动态实例化相关的类,对客户端来说,去除了与具体产品的依赖,与此同时也会带来一个问题:如果我们去增加产品,比如我们要生产苹果电脑,那我们就需要在工厂类中在添加一个Case分支条件,这违背了开放封闭原则,我们对修改也开放了,不理解开放封闭的原则的同学可以查看设计模式(一)设计六大原则 这篇文章。而工厂方法模式就没有违背这个开放封闭原则,如果我们需要生产苹果电脑,并不需要去修改工厂类,直接创建产品就好了。

相关文章

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • 工厂模式

    工厂模式 就是工厂---生产-->产品 在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式. 工厂模式...

  • PHP-浅谈单例模式和工厂模式

    PHP中常用的设计模式有单例模式、工厂模式(简单工厂模式、工厂方法模式和抽象工厂方法模式)、适配模式、策略模式。 ...

  • 设计模式-工厂模式

    设计模式1 设计模式2 工厂模式 工厂模式可简单的分为三类:简单工厂,工厂方法,抽象工厂 简单工厂模式 定义 简单...

  • 设计模式之工厂方法模式(创建型)

    一、模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进...

  • spring 设计模式篇(前)

    设计模式俗称:套路 一、spring常见设计模式 (23种设计模式) 创建型:工厂方法模式、抽象工厂模式、建造者...

  • 设计模式系列-简单工厂模式

    JAVA设计模式系列: 单例模式 观察者模式 模板方法模式 简单工厂模式 定义 简单工厂模式又叫做静态工厂方法模式...

  • 简单工厂模式

    Android进阶之设计模式 简单工厂模式 简单工厂模式(又叫作静态工厂方法模式), 其属于创建型设计模式,但并不...

  • 设计模式之简单工厂、工厂方法、抽象工厂

    设计模式之简单工厂、工厂方法、抽象工厂 什么是设计模式? 设计模式(Design pattern)代表了最佳的实践...

  • 设计模式(六)抽象工厂模式

    导读:前文设计模式(五)工厂方法模式介绍了工厂方法模式,本篇开始介绍抽象工厂模式,继续优化工厂方法模式,更好的满足...

网友评论

    本文标题:设计模式(十)工厂方法模式

    本文链接:https://www.haomeiwen.com/subject/uwqtettx.html