하나의 인스턴스만 가질 수 있는 클래스를 만들고 싶었던 적이 있습니까?
예? 아니? 아마도?
음...
이것이 바로 싱글톤 패턴입니다. 입니다.
문제가 없습니다.
그러나 어떤 사람들은 이것을 나쁜 디자인에 대한 변명으로 사용할 수 있기 때문에 이것을 안티 패턴이라고 부릅니다.
작동 방식을 배울 수 있도록 코드 예제를 살펴보겠습니다.
싱글톤 패턴 코드 예
싱글톤 패턴의 개념은 하나의 인스턴스만 있는 클래스를 원한다는 것입니다.
방법은 다음과 같습니다. :
new
비공개 방법instance
라는 클래스 메서드를 정의합니다. 클래스에 대한 고유한 인스턴스를 반환합니다.
이것은 인기 있는 디자인 패턴이기 때문에 Ruby 표준 라이브러리에는 Singleton
모든 클래스에 포함할 수 있는 모듈입니다.
이렇게 생겼어요 :
require 'singleton' class Shop include Singleton end
이제 Shop
을 만들려고 하면 Shop.new
가 있는 개체 다음 항목이 표시됩니다.
Shop.new # NoMethodError: private method `new' called for Shop:Class
그리고 하나뿐인 Shop
을 원하신다면 instance
를 사용할 수 있는 개체 방법:
Shop.instance.object_id # 5659218 Shop.instance.object_id # 5659218
object_id
절대 변하지 않습니다.
기억해야 할 사항 :
이것은 간단한 패턴으로 개체 생성을 1개의 개체로 제한하며 원할 때마다 해당 개체를 요청할 수 있습니다.
이 패턴을 사용하면 안 되는 이유
싱글톤 패턴은 종종 어떤 형태의 전역 변수를 갖는 핑계이며 전역 변수를 제어할 수 없기 때문에 전역 변수가 나쁘다는 것을 알고 있습니다. 이는 테스트를 어렵게 만들고 결합을 증가시킬 수 있습니다.
<블록 인용>"Singleton의 진짜 문제는 개체의 적절한 가시성에 대해 신중하게 생각하지 않는 좋은 핑계를 제공한다는 것입니다." – 켄트 벡
대부분의 클래스가 의존하는 객체가 있다고 상상해보세요. 이것이 바로 싱글톤 패턴이 될 수 있는 것입니다. 리팩토링을 하시길 바랍니다!
지금 :
이 패턴에 좋은 용도가 있습니까?
Github에서 검색하면 Null 개체 패턴과 함께 Singleton 패턴을 사용하는 일부 repos가 나타났습니다.
그게 말이 되는 것 같아요. Rails는 이것을 ActionPack의 일부로 사용합니다.
코드는 다음과 같습니다. :
class AllType < Type include Singleton def initialize super "*/*", :all end def all?; true; end def html?; true; end end
Type
에서 상속받은 클래스입니다. .
AllType
을 만들 때 instance
를 통한 객체 메서드를 호출하면 super를 호출하고 개체를 반환합니다.
instance
를 호출할 때마다 그 후에는 동일한 개체를 얻게 됩니다.
결론 :
예, 이 패턴은 적절한 상황에서 유용할 수 있지만, 그것에 대해 많이 생각하지 않고 사용하고 싶지는 않습니다.
동영상
요약
싱글톤 디자인 패턴, Ruby에서 구현하는 방법, 대부분 피해야 하는 이유에 대해 배웠습니다.
이 패턴에 대해 어떻게 생각하세요? 전에 본 적이 있습니까? 댓글로 알려주세요 🙂
읽어주셔서 감사합니다!