Scala中的工厂设计模式
我将在以后的文章中提供一系列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是实现此设计模式的最佳语言。
原因是:
- 代码简洁明了
- 没有样板代码
- 非常表达代码