Scala 中的工厂模式
工厂方法用于提供单个接口来实例化多个类之一。在工厂模式中,目标是使对象不暴露给客户端的创建逻辑,并且始终可以在通用接口的帮助下引用新创建的对象。
让我们试着用一个例子来理解它。
假设我们需要为汽车购买应用程序创建一个库。该库应该提供三种汽车类型的选择。
- 标准
- 豪华
- 奢华
我们遵循面向对象的设计,因此我们决定创建三个不同的类。每种车型一个。我们还希望提供获取预订价格、品牌和可用性的方法。所有三个类都将单独实现它们的方法,但我们必须决定一个简单的方法来创建 Car 对象。这样所有的汽车都可以使用相同的方法购买。这是我们要如何预订汽车的示例。第一条语句返回标准汽车的实例。第二个语句返回豪华车,第三个语句返回豪华车。在这种情况下,我们提供了一种方法来创建各种对象。这里的方法 Car 是 Cars 的工厂。我们可以预订我们需要的任何类型的汽车,而且数量不限。这种类型的对象创建使编程非常容易并且代码紧凑。不必担心不同种类的汽车有不同的等级。这就是工厂方法的全部意义所在。
// Scala program of Design factory pattern
// creating abstract class for the car
abstract class Car{
// Creating four abstract methods
def bookingPrice : Double
def Brands : List[String]
def availability : Int
def book(noOfCars:Int)
}
// Creating an object
object Car{
val STANDARD = 0
val DELUXE = 1
val LUXURY = 2
// Creating private class
private class standardCar extends Car{
private var _availability = 100
override def bookingPrice = 200000
override def Brands = List("Maruti", "Tata", "Hyundai")
override def availability = _availability
override def book(noOfCars:Int) = {
_availability = _availability - noOfCars
}
}
// Creating private class
private class DeluxeCar extends Car{
private var _availability = 50
override def bookingPrice = 500000
override def Brands = List("Honda", "Mahindra", "Chevrolet")
override def availability = _availability
override def book(noOfCars:Int) = {
_availability = _availability - noOfCars
}
}
// Creating private class
private class LuxuryCar extends Car{
private var _availability = 5
override def bookingPrice = 900000
override def Brands = List("Audi","BMW", "Mercedes")
override def availability = _availability
override def book(noOfCars:Int) = {
_availability = _availability - noOfCars
}
}
// create the apply method
// single method to create a variety of objects
def apply(carType:Int):Car = {
carType match {
case LUXURY => new LuxuryCar()
case DELUXE => new DeluxeCar()
case STANDARD => new standardCar()
case _ => new standardCar()
}
}
// Main method
def main(args: Array[String])
{
val s = Car(STANDARD)
println(s.bookingPrice)
println(s.availability)
}
}
输出:
200000.0
100
因此,工厂方法有助于简化编程概念。这样,如果声明多个相同类型但有一些不同的对象,我们总是可以节省代码空间和类的数量。