Skip to main content

37. [flutter] 싱글톤 패턴


사용해야 하는 이유​


객체 선언이 중복되면 메모리를 비효율적으로 사용하는 것이기 때문에 자주 선언되는 같은 객체는 한번 선언된다면 다시 선언되지 않아야 해서 싱글톤 패턴을 사용한다.

단일 싱글톤​


예제 코드​

class ResourceManager {
var resourceId;
static ResourceManager? _instance;

ResourceManager._privateConstructor(this.resourceId);

static ResourceManager getInstance(String resourceId) {
_instance ??= ResourceManager._privateConstructor(resourceId);

return _instance!;
}

void useResource() {
print("Using resource: $resourceId");
}
}

??=을 사용하여 객체 instance가 생성되지 않은 null 값일 때만 객체를 생성해서 싱글톤을 유지할 수 있습니다.

사용 예제​


void main() {
var resource1 = ResourceManager.getInstance("Resource1");
resource1.useResource(); // Output: Using resource: Resource1

var resource2 = ResourceManager.getInstance("Resource2");
resource1.useResource(); // Output: Using resource: Resource2
resource2.useResource(); // Output: Using resource: Resource2
}

다중 싱글톤​


예제 코드​

class ResourceManager {
final String resourceId;
static final Map<String, ResourceManager> _instances = {};

ResourceManager._privateConstructor(this.resourceId);

static ResourceManager getInstance(String resourceId) {
if (!_instances.containsKey(resourceId)) {
_instances[resourceId] = ResourceManager._privateConstructor(resourceId);
}
return _instances[resourceId]!;
}

void useResource() {
print("Using resource: $resourceId");
}
}

사용 예제​

void main() {
var resourceA = ResourceManager.getInstance("ResourceA");
var resourceB = ResourceManager.getInstance("ResourceB");

// This will retrieve the same instance as resourceA
var anotherResourceA = ResourceManager.getInstance("ResourceA");

resourceA.useResource(); // Output: Using resource: ResourceA
resourceB.useResource(); // Output: Using resource: ResourceB
}