Scala中的工厂设计模式

时间:2020-02-23 14:41:20  来源:igfitidea点击:

我将在以后的文章中提供一系列Scala设计模式。
我将挑选theitroad上解释的每个Java Design Pattern Tutorial,并将其转换为Scala。

我们还将讨论哪种语言最好:Java和Scala来实现它们。
在本文中,我们将讨论Scala语言中"工厂设计模式"的实现。

在阅读本文之前,请仔细阅读Java版的"工厂设计模式"。

POST简要目录

  • 工厂设计模式
  • 工厂设计模式的优势
  • Scala中的工厂设计模式
  • Scala中改进的工厂设计模式
  • 工厂设计模式:Java与Scala

工厂设计模式

工厂设计模式是流行的创作设计模式之一。

Factory Design Pattern的主要目的是将对象或者实例创建逻辑与客户端分开。
我们在Factory类中实现对象创建逻辑,而不会将该逻辑暴露给客户端。

工厂设计模式也称为工厂方法设计模式。
当我们有一个具有多个子类的超类并且基于输入时,需要返回一个子类时使用它。

工厂设计模式的优势

工厂设计模式具有以下优点:

  • 对象创建逻辑和客户端之间的松散耦合。

  • 明确区分职责。

  • 易于更改对象创建逻辑,而不会影响客户端程序。

Scala中的工厂设计模式

在本节中,我们将采用Java语言实现的现有"工厂设计模式"并将其转换为Scala语言。
我们将在下一部分中完善此示例。

在Scala中,我们可以使用Singleton Object和Pattern Matching实现Factory类。
如果不确定什么是Singleton Object,如何在Scala和模式匹配中实现它,请阅读我的Scala教程。

首先开发我们的类层次结构和Factory类,如下所示:

ComputerFactory.scala

package com.theitroad.designpattern.factory

trait Computer{
def get内存():String
def getHDD():String
def getCPU():String

override def toString = "内存= " + get内存 +", HDD=" + getHDD + ", CPU=" + getCPU
}

private class PC(val ram:String, val hdd:String, val cpu:String) extends Computer{
def get内存():String =  ram
def getHDD():String = hdd
def getCPU():String = cpu
}

private class Server(val ram:String, val hdd:String, val cpu:String) extends Computer{
def get内存():String =  ram
def getHDD():String = hdd
def getCPU():String = cpu
}

object ComputerFactory{
def apply(compType:String, ram:String, hdd:String, cpu:String) = compType.toUpperCase match {
      case "PC" => new PC(ram,hdd,cpu)
      case "SERVER" => new Server(ram,hdd,cpu)
    }
}

Scala没有界面概念。
但是,它比接口具有更强大的概念,即:特性。
我们已经开发出具有所有所需功能或者方法的基础特征。

这里的" ComputerFactory"对象是一个Singleton对象。
它用于提供工厂方法来创建我们的对象。
接下来,开发一个客户来测试此Scala程序。

FactoryMethodDesignPatternClient.scala

object FactoryMethodDesignPatternClient extends App{
val pc = ComputerFactory("pc","2 GB","500 GB","2.4 GHz");
val server = ComputerFactory("server","16 GB","1 TB","2.9 GHz");

println("Factory PC Config::"+pc);
println("Factory Server Config::"+server);
}

输出

Factory PC Config::内存= 2 GB, HDD=500 GB, CPU=2.4 GHz
Factory Server Config::内存= 16 GB, HDD=1 TB, CPU=2.9 GHz

Scala中改进的工厂设计模式

在本节中,我们将通过使用Scala案例类来改进前面的示例。
如果您不熟悉案例类,请阅读我的《 Scala教程》中的" Scala深度案例类"一文。

package com.theitroad.designpattern.factory

trait Computer{
def ram:String
def hdd:String
def cpu:String

override def toString = "内存= " + ram +", HDD=" + hdd + ", CPU=" + cpu
}

private case class PC(ram:String, hdd:String, cpu:String) extends Computer

private case class Server(ram:String, hdd:String, cpu:String) extends Computer

object ComputerFactory{
def apply(compType:String, ram:String, hdd:String, cpu:String) = compType.toUpperCase match {
  case "PC" => PC(ram,hdd,cpu)
  case "SERVER" => Server(ram,hdd,cpu)
}
}

使用相同的客户端来测试该程序,我们将获得相同的输出。

工厂设计模式:Java与Scala

如果我们同时观察Java和Scala Factory Design Pattern示例,则可以观察到Scala是实现此设计模式的最佳语言。
原因是:

  • 代码简洁明了
  • 没有样板代码
  • 非常表达代码