이 글에서는 Go에서 주차장 시스템의 LLD(Low Level Design) 구현을 살펴보겠습니다. 시스템의 다양한 측면을 살펴보고 각 구성 요소가 나머지 구성 요소와 어떻게 상호 작용하는지 살펴보겠습니다. 이 구현은 명확성과 실제 유용성에 중점을 두므로 더 많은 차량 유형, 다양한 결제 옵션 또는 현장 예약과 같은 기능을 추가하려는 경우 쉽게 확장할 수 있습니다.
이 시스템은 주차 층 및 공간 관리, 차량 주차 및 주차 해제, 결제 처리 등의 작업을 처리합니다. 또한 동시 액세스에 대해 스레드로부터 안전한지 확인하므로 더 큰 시스템으로 확장해야 하는 경우에도 압력이 가해지지 않습니다.
저희 디자인에는 6가지 주요 구성요소가 포함됩니다.
저희 ParkingLot은 싱글톤 패턴을 사용합니다. 즉, 한 번 생성되어 애플리케이션 전체에서 재사용되는 주차장 인스턴스가 하나만 있다는 의미입니다. 이를 작동시키는 코드는 다음과 같습니다.
var ( parkingLotInstance *ParkingLot once sync.Once ) type ParkingLot struct { Name string floors []*ParkingFloor } func GetParkingLotInstance() *ParkingLot { once.Do(func() { parkingLotInstance = &ParkingLot{} }) return parkingLotInstance }
sync.Once를 사용하면 여러 고루틴에서 액세스하더라도 하나의 인스턴스만 생성되도록 합니다.
주차장은 여러 층으로 구성되어 있으며 각 층에는 다양한 차량 유형(예: 자동차, 밴, 트럭, 오토바이)을 위한 지정된 주차 공간이 있습니다. 주차장에 층을 추가하려면 AddFloor 메서드를 사용합니다.
func (p *ParkingLot) AddFloor(floorID int) { p.floors = append(p.floors, NewParkingFloor(floorID)) }
각 층은 차량 유형별로 자리를 정리하는 NewParkingFloor 기능을 사용하여 생성됩니다.
각 ParkingSpot은 특정 차량 유형(예: 자동차 또는 오토바이)과 연결되어 있습니다. 이를 통해 시스템은 각 지점에 주차할 수 있는 차량을 관리하고 제한할 수 있습니다. ParkingSpot 구조와 ParkVehicle 메서드는 다음과 같습니다.
type ParkingSpot struct { SpotID int VehicleType vehicles.VehicleType CurrentVehicle *vehicles.VehicleInterface lock sync.Mutex } func (p *ParkingSpot) ParkVehicle(vehicle vehicles.VehicleInterface) error { p.lock.Lock() defer p.lock.Unlock() if vehicle.GetVehicleType() != p.VehicleType { return fmt.Errorf("vehicle type mismatch: expected %s, got %s", p.VehicleType, vehicle.GetVehicleType()) } if p.CurrentVehicle != nil { return fmt.Errorf("parking spot already occupied") } p.CurrentVehicle = &vehicle return nil }
저희는 한 번에 한 지점에 한 대의 차량만 주차할 수 있도록 Mutex 잠금 장치를 사용합니다.
모든 차량에는 출입 시간, 주차 공간, 총 요금이 포함된 티켓이 제공됩니다. 이 티켓은 차량 하차 시 갱신되며, 주차 시간을 기준으로 요금이 계산됩니다.
var ( parkingLotInstance *ParkingLot once sync.Once ) type ParkingLot struct { Name string floors []*ParkingFloor } func GetParkingLotInstance() *ParkingLot { once.Do(func() { parkingLotInstance = &ParkingLot{} }) return parkingLotInstance }
CalculateTotalCharge 메소드는 차량 유형 및 기간을 기준으로 주차 요금을 계산합니다.
PaymentSystem 클래스는 결제를 처리하고 필요한 금액이 결제되었는지 여부에 따라 결제 상태를 업데이트합니다.
func (p *ParkingLot) AddFloor(floorID int) { p.floors = append(p.floors, NewParkingFloor(floorID)) }
ProcessPayment 기능은 금액을 확인하고 결제 상태를 완료 또는 실패로 업데이트합니다.
저희 시스템은 다양한 유형의 차량(자동차, 밴, 트럭, 오토바이)을 지원합니다. 각 유형마다 시간당 요금이 다릅니다. 이는 별도의 차량 패키지에 VehicleType 및 VehicleInterface를 설정하여 달성됩니다.
type ParkingSpot struct { SpotID int VehicleType vehicles.VehicleType CurrentVehicle *vehicles.VehicleInterface lock sync.Mutex } func (p *ParkingSpot) ParkVehicle(vehicle vehicles.VehicleInterface) error { p.lock.Lock() defer p.lock.Unlock() if vehicle.GetVehicleType() != p.VehicleType { return fmt.Errorf("vehicle type mismatch: expected %s, got %s", p.VehicleType, vehicle.GetVehicleType()) } if p.CurrentVehicle != nil { return fmt.Errorf("parking spot already occupied") } p.CurrentVehicle = &vehicle return nil }
각각 VehicleInterface를 구현하는 NewCar, NewVan, NewTruck 등을 호출하여 새로운 차량을 생성할 수 있습니다.
조각들이 흐름에서 어떻게 조화를 이루는지 살펴보겠습니다.
이 주차장 시스템은 더욱 복잡한 시스템을 구축하기 위한 단순화된 출발점입니다. 층별 및 스팟 관리, 차량 주차 및 출차, 기본 결제 과정에 대한 기본 사항을 다루었습니다.
전체 코드 구현을 보려면 다음 저장소를 확인하세요.
Go의 하위 수준 시스템 설계 저장소에 오신 것을 환영합니다! 이 저장소에는 다양한 하위 수준 시스템 설계 문제와 Go로 구현된 솔루션이 포함되어 있습니다. 주요 목표는 실제 사례를 통해 시스템의 설계와 아키텍처를 보여주는 것입니다.
낮은 수준의 시스템 설계에는 시스템 아키텍처의 핵심 개념을 이해하고 확장 가능하고 유지 관리가 가능하며 효율적인 시스템을 설계하는 작업이 포함됩니다. 이 저장소에서는 Go를 사용하여 다양한 문제와 시나리오에 대한 솔루션을 다루려고 합니다.
이 저장소의 첫 번째 프로젝트는 주차장 시스템입니다. 이 시스템은 차량을 주차하고 주차 해제할 수 있는 주차장을 시뮬레이션합니다. 다음을 보여줍니다.
위 내용은 시스템 설계: Go로 주차장 시스템 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!