Меню

Паттерн Singleton (Одиночка)

25.06.2018 - java script, NodeJS, ЯП

Singleton Pattern

Что это такое?

Это единственный экземпляр класса, который доступен для любого вызывающего. Каждый раз, когда Вам нужен экземпляр чего то, вы получаете тот же самый экземпляр, вместо нового.

Какие выгоды при использовании этого паттерна

Он позволяет нам сохранять и получать состояние нашего приложения из любого компонента.
Если что-то пойдет не так, Вам нужно будет исследовать только один экземпляр.
Позволяет не беспокоится об уникальности класса.

//app.js

class HttpClient {
    get(url) {
        return fetch(url).then(res => res.json());
    }
}

class PostsService {

    configure(config) {
        this.configureHttpClient(config);
        this.configureEndpoints(config);
    }

    configureHttpClient(config) {
        if(!config.httpClient) {
            throw new Error("HttpClient not configured");
        }
        this.httpClient = config.httpClient;
    }

    configureEndpoints(config) {
        if(!config.endpoints || !config.endpoints.posts || !config.endpoints.comments) {
            throw new Error("Endpoints poorly configured");
        }

        this.postsEndpoints = config.endpoints.posts;
        this.commentsEndpoints = config.endpoints.comments;
    }

    getPosts() {
        return this.httpClient.get(this.postsEndpoints);
    }

    getComments() {
        return this.httpClient.get(this.commentsEndpoints);
    }

}

class PostsServiceFactory {
    prepareInstance() {
        let config = {
            httpClient: new HttpClient(),
            endpoints: {
                posts: "https://jsonplaceholder.typicode.com/posts",
                comments: "https://jsonplaceholder.typicode.com/comments"
            }
        }
        this.postsService = new PostsService();
        this.postsService.configure(config);
    }

    getInstance() {
        if (!this.postsService) {
            this.prepareInstance();
        }

        return this.postsService;
    }
}

let postsServiceFactory = new PostsServiceFactory();
let postsService = postsServiceFactory.getInstance();
postsService.getPosts().then(posts => console.log("Posts ", posts);
postsService.getComments().then(comments => console.log("Comments ", comments);;

Метки: , , ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *