设计模式23篇之 抽象工厂模式

前两篇博客简单工厂工厂方法的Pizza例子中, 他们都有各自的缺点, 例如还是不够解耦

引入抽象工厂模式:

  1. 抽象工厂模式:定义了一个 trait 用于创建相关或有依赖关系的对象簇,而无需指明具体的类
  2. 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
  3. 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
  4. 将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。

抽象工厂的trait(举例语言为Scala, trait可以看成是Java版的抽象类和接口的合体)

trait AbsFactory {
  //一个抽象方法
  def  createPizza(t : String ): Pizza
}

实现工厂子类

//这时一个实现了AbsFacotory的一个子工厂类
//如果我们希望订购北京的Pizza就使用该工厂子类
class BJFactory extends AbsFactory {
  override def createPizza(t: String): Pizza = {
    var pizza: Pizza = null
    if (t.equals("cheese")) {
      pizza = new BJCheesePizza
    } else if (t.equals("pepper")) {
      pizza = new BJPepperPizza
    }
    return pizza
  }
}

接口回调 充分利用多态

//OrderPizza ,当我们使用抽象工厂模式后,我们订购一个Pizza思路
//1.接收一个子工厂实例,根据该工厂的创建要求去实例
class OrderPizza {

  var absFactory: AbsFactory = _  // _代表默认值 但是必须声明类型让编译器知道

  def this(absFactory: AbsFactory) {
    //多态
    this
    breakable {
      var orderType: String = null
      var pizza: Pizza = null
      do {
        println("请输入pizza的类型 ,使用抽象工厂模式...")
        orderType = StdIn.readLine()
        //使用简单工厂模式来创建对象.
        pizza = absFactory.createPizza(orderType)
        if (pizza == null) {
          break()
        }
        pizza.prepare()
        pizza.bake()
        pizza.cut()
        pizza.box()
      } while (true)
    }
  }
}

想吃北京的还是伦敦的具体看传入的抽象工厂实现类

具体想吃细分的披萨种类呢 就取决于控制台输入的类型了

orderType = StdIn.readLine()

object PizzaStore {
  def main(args: Array[String]): Unit = {
    new OrderPizza(new BJFactory)  //
    //new OrderPizza(new LDFactory)
  }
}
发布了125 篇原创文章 · 获赞 238 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_33709508/article/details/103535809