Scala 工厂模式
工厂方法 是用来提供一个单一的接口来实例化多个类中的一个。在工厂模式中,我们的目标是以这样一种方式来创建对象,即不向客户端暴露创建逻辑,并且可以在一个公共接口的帮助下始终引用一个新创建的对象。
让我们试着用一个例子来理解它。
假设我们需要为一个购车应用程序创建一个库。这个库应该提供三种汽车类型的选择。
- 标准型
- 豪华型
- 豪华型
我们遵循面向对象的设计,因此我们决定创建三个不同的类。每个汽车类型都有一个。我们还想提供一些方法来获得预订价格、品牌和可用性。这三个类都将单独实现它们的方法,但我们必须决定用一个简单的方法来创建一个汽车对象。这样,所有的汽车都可以用同样的方法购买。这里是一个我们想预订汽车的例子。第一条语句返回一个标准汽车的实例。第二条语句返回一个豪华汽车,第三条语句给出一个豪华汽车。在这种情况下,我们提供一个单一的方法来创建各种对象。这里的方法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
因此,工厂方法在使编程概念更容易方面有很大帮助。通过这种方式,我们可以随时节省代码空间和类的数量,如果声明同一类型的多个对象有一些不同之处。