### 싱글톤 패턴 (Singleton Pattern)
싱글톤 패턴은 특정 클래스에 대해 하나의 인스턴스만 존재하도록 보장하고, 그 인스턴스에 접근할 전역적인 방법을 제공합니다. Ruby에서는 `Singleton` 모듈을 활용하여 쉽게 구현할 수 있습니다.
```ruby
require 'singleton'
class DatabaseConnection
include Singleton
def connect
puts "데이터베이스에 연결되었습니다."
end
end
db1 = DatabaseConnection.instance
db1.connect
db2 = DatabaseConnection.instance
puts db1.equal?(db2) # true
```
위 코드에서 `DatabaseConnection` 클래스는 싱글톤으로 구현되어, 모든 인스턴스가 동일한 객체를 참조합니다. 따라서 같은 `connect` 메서드를 호출하더라도 동일한 인스턴스를 사용합니다.
### 팩토리 패턴 (Factory Pattern)
팩토리 패턴은 객체를 생성할 때 생성 로직을 분리하여 클라이언트 코드가 결합되지 않도록 하는 디자인 패턴입니다. Ruby에서는 프로토타입이나 클래스 메서드를 사용하여 구현할 수 있습니다.
```ruby
class VehicleFactory
def self.create_vehicle(type)
case type
when :car
Car.new
when :bike
Bike.new
else
raise "알 수 없는 차량 타입입니다."
end
end
end
class Car
def initialize
puts "자동차가 생성되었습니다."
end
end
class Bike
def initialize
puts "자전거가 생성되었습니다."
end
end
vehicle1 = VehicleFactory.create_vehicle(:car)
vehicle2 = VehicleFactory.create_vehicle(:bike)
```
여기서 `VehicleFactory` 클래스는 `create_vehicle` 메서드를 통해 `Car`나 `Bike` 객체를 생성합니다. 이 방식은 객체 생성 로직을 중앙에서 관리할 수 있게 해주며, 새로운 차량 타입을 쉽게 추가할 수 있습니다.
### 옵저버 패턴 (Observer Pattern)
옵저버 패턴은 객체의 상태 변화를 관찰하고, 상태가 변경될 때 의존하는 객체들에게 자동으로 알림이 가는 디자인 패턴입니다. Ruby에서는 옵저버 패턴을 자체적인 `Observer` 모듈이나 콜백 메서드로 구현할 수 있습니다.
```ruby
class Publisher
def initialize
@subscribers = []
end
def subscribe(subscriber)
@subscribers << subscriber
end
def notify(event)
@subscribers.each { |subscriber| subscriber.update(event) }
end
end
class Subscriber
def update(event)
puts "이벤트 수신: #{event}"
end
end
publisher = Publisher.new
subscriber1 = Subscriber.new
subscriber2 = Subscriber.new
publisher.subscribe(subscriber1)
publisher.subscribe(subscriber2)
publisher.notify("새 글이 게시되었습니다.")
```
위 예제에서는 `Publisher` 클래스가 `subscriber`들을 관리하고, `notify` 메서드를 통해 이벤트를 알립니다. `Subscriber` 클래스는 `update` 메서드를 구현하여 이벤트를 처리합니다. 이를 통해 쉽게 다대다 관계를 관리할 수 있습니다.
이와 같이 각기 다른 디자인 패턴을 Ruby로 구현하면 코드의 유연성과 재사용성을 크게 향상시킬 수 있습니다. 디자인 패턴을 공부하고 실제 프로젝트에 적용해보면서 소프트웨어 설계 능력을 향상시켜 보세요.