Skip to content

Instantly share code, notes, and snippets.

@aainaj
Created March 11, 2020 12:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aainaj/90cc0f60baafe568c6e43a39564b4033 to your computer and use it in GitHub Desktop.
Save aainaj/90cc0f60baafe568c6e43a39564b4033 to your computer and use it in GitHub Desktop.
Example to show object pool design pattern
enum PaymentMethod {
case creditCard
case debitCard
case wallet
case cash
}
protocol PaymentPresenterStrategy {}
protocol MethodsPresenterResolvable {
func register(methods: [PaymentMethod])
func resolvePresenter(for method: PaymentMethod) -> PaymentPresenterStrategy?
}
final class MethodsPresenterResolver: MethodsPresenterResolvable {
private var presenterCache: [PaymentMethod: PaymentPresenterStrategy]?
func register(methods: [PaymentMethod]) {
var cache = [PaymentMethod: PaymentPresenterStrategy]()
for method in methods {
guard let paymentPresenter = presenter(for: method) else {
continue
}
cache[method] = paymentPresenter
}
presenterCache = cache
}
func resolvePresenter(for method: PaymentMethod) -> PaymentPresenterStrategy? {
return presenterCache?[method]
}
private func presenter(for method: PaymentMethod) -> PaymentPresenterStrategy? {
switch method {
case .creditCard:
return CreditCardPresenter()
case .debitCard:
return DebitCardPresenter()
case .wallet:
return WalletPresenter()
case .cash:
return CashPresenter()
}
}
}
final class CreditCardPresenter: PaymentPresenterStrategy {}
final class DebitCardPresenter: PaymentPresenterStrategy {}
final class WalletPresenter: PaymentPresenterStrategy {}
final class CashPresenter: PaymentPresenterStrategy {}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment