Scala设计模式--工厂模式

工厂模式

1.简单工厂模式

/**
  * 汽车的共同特质
  */
trait Car{
  def run()
}

/**
  * 创建一个宝马类
  */
class BaoMa extends Car {
  override def run(): Unit = println("宝马车开走了")
}

/**
  * 创建一个奔驰类
  */
class  Benz extends Car {
  override def run(): Unit = println("奔驰车开走了")
}


/**
  * 简单工厂类 生产汽车
  */
object SimpleCarFactory {

  def createCar(demand:String)= demand match {
      case "Baoma"=>new BaoMa
      case "Benz"=>new Benz
      case _=>null
    }

}
总结:简单工厂模式比较鸡肋,不符合开闭原则。可以用工厂方法模式进行改善

2.工厂方法模式

工厂方法模式与简单工厂最大的区别就是在原来的基础行多了一个工厂接口,
然后增加多个工厂实现类去对应不同的产品类(汽车类)
/**
  * 工厂特质
  */
trait CarFactory{
  val createCar:Car
}

/**
  * 宝马工厂 生产宝马
  */
class BaoMaFactory extends CarFactory{
  override val createCar: Car = new BaoMa
}
object BaoMaFactory{
  def apply(): BaoMaFactory = new BaoMaFactory()
}

/**
  * 奔驰工厂 生产奔驰
  */

class BenzFactory extends CarFactory{
  override val createCar = new Benz
}
object BenzFactory{
  def apply(): BenzFactory = new BenzFactory()
}

调用


/**
  * 客户(调用者)
  */
object CarBuyer{
  def main(args: Array[String]): Unit = {

    println("--------------------简单工厂模式--------------")
    val car = SimpleCarFactory.createCar("Baoma")
    val car1 = SimpleCarFactory.createCar("Benz")

    car.run()
    car1.run()

    println("-------------------工厂方法模式--------------")

    BaoMaFactory().createCar.run()
    BenzFactory().createCar.run()

  }
}

执行结果

--------------------简单工厂模式--------------
宝马车开走了
奔驰车开走了
-------------------工厂方法模式--------------
宝马车开走了
奔驰车开走了

Process finished with exit code 


总结:
	当需要新增加产品时,只需要实现对应的工厂实现类即可进行扩展,缺点就是会有大量的类需要创建。
	该模式可以视为简单工厂模式的升级版

3.抽象工厂模式

同一品牌下,有不同类型的汽车。
假如客户在购买时,需要进行个性化定制(不同排量的跑车或者越野车),
那么这种时候就可以使用抽象工厂模式,构建不同的产品族。
抽象工厂模式不同于以上两种模式

/**
  * 按照排量划分类别
  */
trait Engine{
  val burnMoney:String
}

/**
  * 大排量 烧钱
  */
class BigEngine extends Engine{
  override val burnMoney = "人民币玩家买大排量"
}
object BigEngine{
  def apply(): BigEngine = new BigEngine()
}

/**
  * 小排量 经济
  */
class SmallEngine extends Engine {
  override val burnMoney = "经济适用男买小排量"
}
object SmallEngine{
  def apply(): SmallEngine = new SmallEngine()
}

/**
  * 按照车型划分类别
  */
trait CarCategory{
  val use:String
}

/**
  * 超跑类汽车,为了撩妹
  */
class SportCar extends CarCategory{
  override val use = "跑车找妹子"
}
object SportCar{
  def apply(): SportCar = new SportCar()
}

/**
  * 越野型汽车,为了刺激
  */
class SUV extends CarCategory{
  override val use = "越野找刺激"
}
object SUV{
  def apply(): SUV = new SUV()
}

/**
  * 工厂特质
  */
trait  Car1Factory{
  val run:Unit
}

/**
  * 定制奔驰
  * @param engine
  * @param carCategory
  */
class Benz1(var engine: Engine,var carCategory: CarCategory) extends Car1Factory{

  override val run: Unit = println(engine.burnMoney+"奔驰"+carCategory.use)
}

/**
  * 定制宝马
  * @param engine 排量
  * @param carCategory 车型
  */
class BWM1(var engine: Engine,var carCategory: CarCategory)extends Car1Factory{
  override val run: Unit = println(engine.burnMoney+"宝马"+carCategory.use)
}

调用

/**
  * 调用
  */
object Buyer{

  def main(args: Array[String]): Unit = {

    //需要大排量的奔驰跑车
    new Benz1(BigEngine(),SportCar()).run
    //需要小排量的宝马越野
    new BWM1(SmallEngine(),SUV()).run

  }
}

执行结果

人民币玩家买大排量奔驰跑车找妹子
经济适用男买小排量宝马越野找刺激

Process finished with exit code 0

你可能感兴趣的:(设计模式--scala)