设计模式-5.工厂方法模式

143 阅读1分钟

一句话总结

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到子类。

需求

热心大学生和社区志愿者都可以去帮助周边孤寡老人,那么如何实现创建这些热心对象呢?

简单工厂模式实现

static func main() {
    let undergraduate = SimpleFctory.creatLeiFeng(type: "热心大学生")
    undergraduate.sendFruit()
    undergraduate.cleaningYard()
}

class LeiFeng {
    func sendFruit() {
        print("送水果")
    }

    func cleaningYard() {
        print("打扫院子")
    }
}

class Undergraduate: LeiFeng { }

class Volunteer: LeiFeng { }

class SimpleFctory {
    static func creatLeiFeng(type: String) -> LeiFeng {
        var leiFeng: LeiFeng = Undergraduate()
        switch type {
        case "热心大学生":
            leiFeng = Undergraduate()
        case "社区志愿者":
            leiFeng = Volunteer()
        default:
            break
        }
        return leiFeng
    }
}

工厂方法模式实现

static func main() {
    let volunteer = VolunteerFctory.creatLeiFeng()
    volunteer.sendFruit()
    volunteer.cleaningYard()
}

class LeiFeng {
    func sendFruit() {
        print("送水果")
    }

    func cleaningYard() {
        print("打扫院子")
    }
}

class Undergraduate: LeiFeng { }

class Volunteer: LeiFeng { }

protocol LeiFengFctory {
    static func creatLeiFeng() -> LeiFeng
}

class UndergraduateFctory: LeiFengFctory {
    static func creatLeiFeng() -> LeiFeng {
        return Undergraduate()
    }
}

class VolunteerFctory: LeiFengFctory {
    static func creatLeiFeng() -> LeiFeng {
        return Volunteer()
    }
}

简单工厂模式优点

工厂类包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对客户端来说,去除了对具体产品的依赖。

工厂方法模式优点

简单工厂模式在对产品进行扩展时,需要改工厂类的switch和客户端选择条件,违背了开放-封闭原则。工厂方法模式可以规避这一缺陷,由客户端选择用哪个工厂类来生成产品。

简单工厂与工厂方法区别

  • 简单工厂是工厂类内部判断实例化哪一个产品类。
  • 工厂方法是客户端选择使用哪个工厂类。
  • 都会有选择判断的逻辑。