美文网首页
工厂模式?代码怎样优化?

工厂模式?代码怎样优化?

作者: flionel | 来源:发表于2018-06-14 09:29 被阅读12次
protocol ModelType {}
struct Car: ModelType {
    var name: String = ""
    var speed: Int = 0
    var price: Int = 0
    var color: UIColor!
    var createdAt: Date!
}

直接创建对象

没有使用任何模式的情况下,直接创建对象的方式,代码如下,

let bmwCar = Car(name: "BMW", speed: 125, price: 244000, color: UIColor.white, createdAt: Date())

创建第二个对象

let audiCar = Car(name: "Audi", speed: 120, price: 250000, color: UIColor.black, createdAt: Date())

这无疑写了很多重复代码,况且,若此时Car模型新增若干属性,例如,

struct Car: ModelType {
    // 原来的属性
    var name: String = ""
    var speed: Int = 0
    var price: Int = 0
    var color: UIColor!
    var createdAt: Date!
    // 新增属性
    var wheelNumber: Int = 0
    var maxAge: Int = 0 // 使用寿命上限
}

此时创建对象是这样的,

// 三轮车
let threeWheelCar = Car.init(name: "三轮车", speed: 20, price: 10000, color: UIColor.red, createdAt: Date(), wheelNumber: 3, maxAge: 4)

这无疑为创建对象带来了麻烦,之前写的代码都要修改一遍。

使用工厂模式

protocol AbstractFactory {
    associatedtype Product: ModelType
    static func makeProduct() -> Product
}

class CarFactory: AbstractFactory {
    static func makeProduct() -> Car {
        let car = Car.init(name: "", speed: 0, price: 0, color: UIColor.white, createdAt: Date(), wheelNumber: 4, maxAge: 10)
    }
}

let car = CarFactory.makeProduct()
print(car.createdAt)

使用这样的工厂模式,能够创建一个带有默认属性的Car,但是,因为方法签名- makeProduct没有额外的参数,这样就不能创建指定属性的Car对象,当然我可以改一下AbstractFactory中的- makeProduct签名,如下代码,

protocol AbstractFactory {
    associatedtype Product: ModelType
    static makeProduct(name: String, speed: Int, price: Int, color: UIColor, createdAt: Date, wheelNumber: Int, maxAge) -> Product
}

CarFactory: AbstractFactory {
    static makeProduct(name: String, speed: Int, price: Int, color: UIColor, createdAt: Date, wheelNumber: Int, maxAge) -> Car {
        let car = Car.init(name: "", speed: 0, price: 0, color: UIColor.white, createdAt: Date(), wheelNumber: 4, maxAge: 10)
        return car
    }
}

但是,这样实现,AbstractFactory的方法名不具备通用性,例如,想增加一个Bus类型,构建BusFactory实现AbstractFactory协议,此时,BusFactroy的实现如下,

struct Bus: ModelType {
    var name: String = ""
    var price: String = ""
    var wheelNum: Int = 0
    var maxAge: Int = 0
    var maxPassengers: Int = 0 // 最大载客数
    // 以及其他属性
    // ....
}


class BusFactroy: AbstractFactory {
    static makeProduct(name: String, speed: Int, price: Int, color: UIColor, createdAt: Date, wheelNumber: Int, maxAge) -> Bus {
    // 尴尬了,因为方法名定义不具备通用性
    // 现在不能创建Bus对象了
    }
}

Question

so,我的疑问是,工厂模式的方法签名怎样定义,能具备通用性?

附:好像抽象工厂模式可以解决这种问题,帅帅,若有好的方案,能够分享下。

相关文章

  • 工厂模式?代码怎样优化?

    直接创建对象 没有使用任何模式的情况下,直接创建对象的方式,代码如下, 创建第二个对象 这无疑写了很多重复代码,况...

  • 一次代码优化实践,用了模板方法+策略+工厂方法模式

    前言 今天来一份代码优化总结。用模板方法+策略+工厂方法模式优化了代码,耐心点看完,应该对大家有帮助的~ 优化代码...

  • 如何理解这6种常见设计模式?

    简介: 设计模式能够帮助我们优化代码结构,让代码更优雅灵活。有哪些常见的设计模式?如何合理运用?本文分享作者对工厂...

  • 简单工厂模式、工厂模式、抽象工厂模式

    getReceiver 代码: 缺点:不符合开闭原则 工厂模式 代码: 缺点:单一 抽象工厂模式 总结:工厂模式与...

  • 设计模式(五)工厂方法模式

    导读:前文设计模式(四)简单工厂模式介绍了简单工厂模式,本篇开始介绍工厂方法模式,继续优化简单工厂模式,更好的满足...

  • 常见三种设计模式

    1:builder工厂模式通过平时对代码的总结和优化,我们经常可以将原先复杂的代码改写成简单易懂的代码,增强代码可...

  • 设计模式(3) 抽象工厂模式

    抽象工厂模式 优化抽象工厂 异步工厂 在学习抽象工厂模式前,先来回顾一下前面的简单工厂和工厂方法模式。简单工厂的职...

  • 设计模式(六)抽象工厂模式

    导读:前文设计模式(五)工厂方法模式介绍了工厂方法模式,本篇开始介绍抽象工厂模式,继续优化工厂方法模式,更好的满足...

  • 工厂方法模式

    工厂方法模式其实是对简单工厂模式进行优化,简单工厂模式拓展需要修改原来的类,也就是添加case。。 工厂方法模式每...

  • 抽象工厂模式

    一、抽象工厂模式介绍 二、抽象工厂模式代码实例

网友评论

      本文标题:工厂模式?代码怎样优化?

      本文链接:https://www.haomeiwen.com/subject/znyeeftx.html