📜  Scala 中的工厂模式

📅  最后修改于: 2022-05-13 01:55:23.161000             🧑  作者: Mango

Scala 中的工厂模式

工厂方法用于提供单个接口来实例化多个类之一。在工厂模式中,目标是使对象不暴露给客户端的创建逻辑,并且始终可以在通用接口的帮助下引用新创建的对象。

让我们试着用一个例子来理解它。

假设我们需要为汽车购买应用程序创建一个库。该库应该提供三种汽车类型的选择。

  1. 标准
  2. 豪华
  3. 奢华

我们遵循面向对象的设计,因此我们决定创建三个不同的类。每种车型一个。我们还希望提供获取预订价格、品牌和可用性的方法。所有三个类都将单独实现它们的方法,但我们必须决定一个简单的方法来创建 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

因此,工厂方法有助于简化编程概念。这样,如果声明多个相同类型但有一些不同的对象,我们总是可以节省代码空间和类的数量。