Actual world static manufacturing facility sample examples
Named constructors
The primary benefit of the static manufacturing facility sample is that each static manufacturing facility methodology can have a reputation. Apple makes use of this sample of their UIColor
class implementation to create named colours like .crimson
, .yellow
, and many others. Please notice that the implementation in Swift isn’t actually a way, however a static property, which returns the precise occasion.
public extension TimeInterval {
public static var second: TimeInterval { return 1 }
public static var minute: TimeInterval { return 60 }
public static var hour: TimeInterval { return 3_600 }
public static var day: TimeInterval { return 86_400 }
public static var week: TimeInterval { return 604_800 }
}
If it is so arduous to memorize what number of seconds is a day or every week why do not we create a named initializer for it. See? TimeInterval.week
is a lot better than 604_800
. 😅
Cached objects
The following benefit of the static manufacturing facility sample is that it will possibly assist caching for the sake of higher reminiscence utilization. This fashion you’ll be able to restrict the variety of objects created if you’re initializing it by the static constructor (aka. static manufacturing facility methodology). 🏭
class Service {
var title: String
non-public static var cache: [String:Service] = [:]
non-public static func cached(title: String) -> Service {
if Service.cache[name] == nil {
Service.cache[name] = Service(named: title)
}
return Service.cache[name]!
}
static var native: Service {
return Service.cached(title: "native")
}
static var distant: Service {
return Service.cached(title: "distant")
}
init(named title: String) {
self.title = title
}
}
Native initialization scope
One other benefit of static manufacturing facility strategies you could restrict the initialization of a category to a non-public scope degree. In different phrases object creation will solely be accessible by the static manufacturing facility methodology. You simply should make the init
methodology non-public.
public last class Service {
var title: String
non-public init(title: String) {
self.title = title
}
public static var native: Service {
return Service(title: "native")
}
public static var distant: Service {
return Service(title: "distant")
}
}
Observe you could limit subclassing with the ultimate & static key phrase. If you wish to permit subclassing you need to take away last
and use the class
key phrase as a substitute of the static
for the properties, this fashion subclasses can override manufacturing facility strategies. 🤔
Statically return something
Static manufacturing facility also can return subtypes of a given object, however why do not we take this even one step additional? You can even return any sort of sort from a static methodology, I do know this looks as if a cheat, as a result of I am not creating an occasion of UIColor
right here, however I imagine that it is price to say this methodology right here, as a result of it is carefully associated to static factories. This system might be actually helpful typically. 😛
extension UIColor {
non-public static func picture(with shade: UIColor) -> UIImage {
let rect = CGRect(x: 0, y: 0, width: 1, top: 1)
UIGraphicsBeginImageContext(rect.measurement)
let context = UIGraphicsGetCurrentContext()!
context.setFillColor(shade.cgColor)
context.fill(rect)
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return img!
}
static var redImage: UIImage {
return UIColor.picture(with: .crimson)
}
}