设计模式之工厂模式

栏目: 后端 · 发布时间: 6年前

内容简介:简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例它有这三种角色举个例子,我们是一个电脑代工商,主要生产联想、华硕、惠普的电脑。

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例

设计模式之工厂模式

它有这三种角色

  • Factory:工厂类,它负责实现创建所有实例。工厂类的创建产品类可以被外界调用,创建所需的对象。
  • IProduct:抽象产品类,这是所有产品的父类,用于描述所有产品应该有的共同方法
  • Product:具体产品类

举个例子,我们是一个电脑代工商,主要生产联想、华硕、惠普的电脑。

首先创建计算机抽象产品类,用来描述共同特征

public abstract class Computer{
  //所有电脑都有开机功能
  public abstract void start();
}

接下来创建具体产品类

public class LenvoComputer 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 class ComputerFactory{
  public static Computer createComputer(String type){
    Computer mComputer = null;
    switch (type){
      case "lenovo":
        mComputer = new LenvoComputer();
        break;
      case "hp":
        mComputer = new HpComputer();
        break;
      case "asus":
        mComputer = new AsusComputer();   
        break;
    }
    return mComputer;
  }
}

客户端调用工厂类,创建一个惠普电脑,并开机

public class Client {
  public static void main(String[] args){
    ComputerFactory.createComputer("hp").start();
  }
}

在这里你们也觉察到了,这里电脑的类型是确定的,要增加新类型,就要修改工厂,这意味着它已经违背了开放封闭原则。当然它也有优点,就是让用户根据参数获得对应的类的实例,避免直接实例化类,降低耦合性。因此这个模式适用的场景是创建的对象类别比较少的情况。

工厂方法模式

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

设计模式之工厂模式

首先创建计算机抽象产品类,用来描述共同特征

public abstract class Computer{
  //所有电脑都有开机功能
  public abstract void start();
}

接下来创建具体产品类

public class LenvoComputer 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("华硕计算机启动");
  }
}

创建抽象工厂

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

创建具体工厂,通过反射来生产不同厂家的计算机

public class ComputerFactory extends IComputerFactory{
  @Override
  public  <T extends Computer> T createComputer(Class<T> clz){
    Computer computer = null;
    String className = clz.getName();
    try{
      computer = (Computer) Class.fromName(className).newInstance();
    }catch (Exception e) {
      e.printStackTrace();
    }
    return (T) computer;
  }
}

客户端调用

public class Client {
  public static void main(String[] args){
    ComputerFactory computerFactory = new ComputerFactory();
    LenvoComputer lenovo = computerFactory.createComputer(LenvoComputer.class);
    lenovo.start();
  }
}

对于简单工厂模式,实例化位于工厂类,当我们需要增加产品时,就需要在工厂类中加一个case,这就违背开放封闭原则。而在工厂模式,由于是通过反射的形式,我们不需要修改工厂的代码。


以上所述就是小编给大家介绍的《设计模式之工厂模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Perl语言入门

Perl语言入门

[美] Randal L.Schwartz、Tom Phoenix / 李晓峰 / 中国电力出版社 / 2002-8 / 48.00元

本书第一版于1993年问世,并从此成为畅销书。本书由Perl社区最著名、最活跃的两位成员写成,是Perl程序设计语言的精髓指南。 Perl最初只是Unix系统管理员的一个工具,在工作日里被用在无数的小任务中。从那以后,它逐步发展成为一种全功能的程序设计语言,特别是在各种计算平台上,它被用作Web编程、数据库处理、XML处理以及系统管理——它能够完成所有这些工作,同时仍然是处理小的日常工作的完......一起来看看 《Perl语言入门》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

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

HTML 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具