Меню
Главная
Случайная статья
Настройки
|
Прототип, (англ. Prototype) — порождающий шаблон проектирования.
Содержание
Назначение
Задаёт виды создаваемых объектов с помощью экземпляра-прототипа и создаёт новые объекты путём копирования этого прототипа. Он позволяет уйти от реализации и позволяет следовать принципу «программирование через интерфейсы». В качестве возвращающего типа указывается интерфейс/абстрактный класс на вершине иерархии, а классы-наследники могут подставить туда наследника, реализующего этот тип.
Проще говоря, это паттерн создания объекта через клонирование другого объекта вместо создания через конструктор.
Применение
Паттерн используется чтобы:
- избежать дополнительных усилий по созданию объекта стандартным путём (имеется в виду использование конструктора, так как в этом случае также будут вызваны конструкторы всей иерархии предков объекта), когда это непозволительно дорого для приложения.
- избежать наследования создателя объекта (object creator) в клиентском приложении, как это делает паттерн abstract factory.
Используйте этот шаблон проектирования, когда системe безразлично как именно в ней создаются, компонуются и представляются продукты:
- инстанцируемые классы определяются во время выполнения, например с помощью динамической загрузки;
- избежать построения иерархий классов или фабрик, параллельных иерархии классов продуктов;
- экземпляры класса могут находиться в одном из нескольких различных состояний. Может оказаться удобнее установить соответствующее число прототипов и клонировать их, а не инстанцировать каждый раз класс вручную в подходящем состоянии.
Примеры
Пример на Python#!/usr/bin/env python
# -*- coding: utf-8 -*-
import copy
class Prototype:
def __init__(self):
self._objects = {}
def register_object(self, name, obj):
"""Register an object"""
self._objects[name] = obj
def unregister_object(self, name):
"""Unregister an object"""
del self._objects[name]
def clone(self, name, **attr):
"""Clone a registered object and update inner attributes dictionary"""
obj = copy.deepcopy(self._objects.get(name))
obj.__dict__.update(attr)
return obj
class A:
def __init__(self):
self.x = 3
self.y = 8
self.z = 15
self.garbage = [38, 11, 19]
def __str__(self):
return '{} {} {} {}'.format(self.x, self.y, self.z, self.garbage)
def main():
a = A()
prototype = Prototype()
prototype.register_object('objecta', a)
b = prototype.clone('objecta')
c = prototype.clone('objecta', x=1, y=2, garbage=[88, 1])
print([str(i) for i in (a, b, c)])
if __name__ == '__main__':
main()
- OUTPUT ###
- ['3 8 15 [38, 11, 19]', '3 8 15 [38, 11, 19]', '1 2 15 [88, 1]']
Пример на C++
|
|