70

设计模式之工厂模式

 6 years ago
source link: http://coderlengary.github.io/2018/08/03/DesignModeFactory/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

fUzuuqm.png!web

它有这三种角色

  • 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();
  }
}

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

工厂方法模式

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

2iEjmy7.png!web

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

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,这就违背开放封闭原则。而在工厂模式,由于是通过反射的形式,我们不需要修改工厂的代码。


Recommend

  • 43

  • 56
    • www.tuicool.com 5 years ago
    • Cache

    [go设计模式]简单工厂模式

    优点 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象...

  • 39
    • chenjiabing666.github.io 5 years ago
    • Cache

    设计模式:工厂方法模式

    工厂方法模式是所有设计模式中比较常用的一种模式,但是真正能搞懂用好的少之又少,Spring底层大量的使用该设计模式来进行封装,以致开发者阅读源代码的时候晕头转向。 今天陈某分别从以下五个方面详细讲述一下工厂方法...

  • 21
    • www.cnblogs.com 5 years ago
    • Cache

    设计模式——抽象工厂模式

    目录 设计模式——抽象工厂模式 2. 示例1-使用工厂模式实现对不同数据库的操作 3. 示例2-多数据库且多表操作 4. 重构示例2-使用简单工厂改进抽象工厂 5. 重构...

  • 33
    • jiajunhuang.com 4 years ago
    • Cache

    Go设计模式:简单工厂模式

    原始的工厂模式太过于繁冗,我几乎不用。但是简单工厂模式是经常用到的,比如: def get_duck(color): if color == "yello": return YelloDuck() elif color == "blue": return BlueDuck() else:...

  • 36

  • 12
    • rollingstarky.github.io 4 years ago
    • Cache

    Python 设计模式——工厂模式

    Python 设计模式——工厂模式 发表于 2020-12-22 ...

  • 6
    • segmentfault.com 4 years ago
    • Cache

    设计模式-工厂模式

    参考资料 图解设计模式 大话设计模式 设计模式之禅 github我见过最好...

  • 17
    • 微信 mp.weixin.qq.com 4 years ago
    • Cache

    设计模式系列| 工厂方法模式

    大家好,我是狼王,一个爱打球的程序员 ❝ 这是设计模式的第二篇,我们都知道 「工厂模式」 有三种, 「简单工厂,工厂方法,抽象工厂」 ,这篇让我们来认识一下

  • 10

    三种工厂模式以及应用三种工厂模式,都属于创建型类型,就是关心如果创建出对象,不过 简单工厂模式 是不包含在《23种G0F》里面的,不过还是通常用的,所以这里也介绍。 简单工厂提供一个全局访问的实体,通过这个实体的一个静态...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK