생성 모드 - 단례

2431 단어
장면 사용: 하나의 실례만 필요합니다.예를 들어 현실 세계의 자원: 서버;공유 자원을 봉인하거나 포장합니다.

의미:


1. 여러 번 만들지 않도록 만든 실례를 항상 한 부 유지합니다.2. 대상과 현실 자원이 대응한다.3. 공유 자원을 봉인한다.

Swift 단례 만들기


1. 글로벌 상수 사용
// 
let globalLogger = Logger()

//final , 
final class Logger{
    
    private var data = [String]()
    private let arrayQ = DispatchQueue.init(label: "arrayQ")
    // , 
    fileprivate init() { 
    }
    
    func log(msg:String){
        // 
        arrayQ.sync {
            data.append(msg)
        }
    }
    
    func printLog(){
       for msg in data {
            print("Log:\(msg)")
        }
    }
}


2. 구조체 사용
final class BackupServer {
   // 
   fileprivate init(name:String) {
        self.name = name
        globalLogger.log(msg: "Created new server \(name)")
    }

    //BackupServer server, 
    class var server:BackupServer{
        // 
        struct SingletonWrapper{
            // , 
            static let singleton = BackupServer.init(name: "MainServer")
        }
        // 
        return SingletonWrapper.singleton
    }
}

사용 참고:


1. Swift의 단일 예제 모드는 참조 유형, 즉 클래스에만 적용됩니다.구조체와 다른 값 유형은 사용할 수 없다. 왜냐하면 구조체 자체가 복제 기능을 가지고 있기 때문이다.
2. 처리와 병행.예를 들어 공유 자원이기 때문에 안에 수조, 사전 등 집합이 있으면 읽기와 쓰기 작업을 할 때 스레드 안전 문제를 고려하여 여러 개의 스레드가 동시에 하나의 집합을 쓰지 않도록 해야 한다.Swift3의 GCD는 적응이 필요합니다.
  • 직렬을 사용합니다. 예를 들어 전역 변수를 사용하여 단일 예시를 만드는 경우
  •   func log(msg:String){
            // 
            arrayQ.sync {
                data.append(msg)
            }
        }
    
  • 도 직렬로 쓰고 병렬로 읽을 수 있다.barrier를 사용했는데 그 기능은 barrier block 대기열의 맨 끝에 도달했을 때 직렬 대기열로 바뀌어 모든 작업이 끝날 때까지 기다렸다가 완성된 후에 다음 barrier block 대기열이 나타날 때까지 병렬 대기열을 복구하는 것이다.
  • var arrayQ = DispatchQueue.init(label: "arrayQ")
    func logItem(item:T) {
            //dispatch_barrier  
            // barrier , , 
            // , barrier
            arrayQ.async(execute: DispatchWorkItem.init(qos: DispatchQoS.default, flags: DispatchWorkItemFlags.barrier, block: { 
                self.dataItems.append(item.copy() as! T)
                self.callback(item)
            }))
        }
    
    

    demo


    예는 모두 여기에 있다

    뒤에 쓰기:


    내가 쓴 디자인 모델에 관한 내용은 모두 책《 Swift 》에서 나온 것이기 때문에 흥미가 있으면 직접 사서 볼 수 있고 나의'왜곡된 이해'를 볼 필요가 없다.나는 단지 짐꾼일 뿐, 과정을 기록하고, 약간의 간단한 이해를 기록할 뿐이다.

    좋은 웹페이지 즐겨찾기