Prototype (padrón de deseño)

Prototype é un padrón de deseño creacional que ten como finalidade crear novos obxectos duplicándoos, clonando unha instancia creada previamente. Este padrón especifica a clase de obxectos a crear mediante a clonación dun prototipo que é unha instancia xa creada. A clase dos obxectos que servirán de prototipo deberá incluír na súa interface a maneira de solicitar unha copia, que será desenvolvida máis tarde polas clases concretas de prototipos. Cada obxecto é, en si mesmo, unha fábrica especializada en construír obxectos iguais a el mesmo.

Motivación

Este padrón resulta útil en escenarios onde é preciso abstraer a lóxica que decide que tipos de obxectos utilizará unha aplicación, da lóxica que logo usarán eses obxectos na súa execución. Os motivos desta separación poden ser variados, por exemplo, pode ser que a aplicación deba basearse nalgunha configuración ou parámetro en tempo de execución para decidir o tipo de obxectos que se debe crear. Nese caso, a aplicación necesitará crear novos obxectos a partir de modelos. Estes modelos, ou prototipos, son clonados e o novo obxecto será unha copia exacta dos mesmos, co mesmo estado.

Aplicabilidade

Cando un sistema debe ser independente da forma na que os seus produtos son creados e as clases a instanciar son especificadas en tempo de execución ou cando só existe un número pequeno de combinacións diferentes de estado para as instancias dunha clase. No caso, por exemplo, dun editor gráfico, podemos crear rectángulos, círculos etc... como copias de prototipos. Estes obxectos gráficos pertencerán a unha xerarquía na que as súas clases derivadas porán en funcionamento o mecanismo de clonación.

Estrutura

Na seguinte imaxe podemos ver a estrutura do padrón, no exemplo citado no punto anterior:

Participantes

Cliente: Encárgase de crear un novo obxecto solicitándolle ao prototipo que se clone.

Prototipo Concreto: Posúe unhas características concretas que serán reproducidas para novos obxectos e pon en funcionamento unha operación para clonarse.

Prototipo: Declara unha interface para clonarse, á cal accede o cliente.

Colaboracións

O cliente solicita ao prototipo que se clone.

Consecuencias

Aplicar o padrón prototipo permite ocultar as clases produto (prototipos concretos) do cliente e tamén permite que o cliente traballe con clases dependentes da aplicación sen cambios.

Ademais, é posible engadir e eliminar produtos en tempo de execución ao invocar a operación clonar.

Este padrón permite a especificación de novos obxectos mediante o cambio dos seus valores ou mediante a variación da súa estrutura.

Permite unha configuración dinámica da aplicación, reducindo o numero de subclases.

Desvantaxes

A xerarquía de prototipos debe ofrecer a posibilidade de clonar un elemento e esta operación pode non ser sinxela de incluír. Se a clonación se produce frecuentemente, o custo pode ser importante. Ademais as clases encargadas de crear os obxectos novos deben coñecer as clases concretas dos obxectos que van instanciar.

Outros detalles

Unha interface declara un conxunto de funcións, pero sen introducilas. En Java existe unha interface chamada Cloneable.

public interface Cloneable { 
}

Unha clase que introduce esta interface é a clase Object que pode facer unha copia membro a membro das instancias de dita clase. Nos exemplos de inclusión de clonación profunda e a clonación superficial se usará esta interface.

Clonación profunda e clonación superficial

Entre as diferentes modalidades polas que se pode optar á hora de introducir a clonación dun obxecto prototipo, merece a pena destacar dúas maneiras de realizar a clonación: superficial ou profunda.

Na primeira delas, un cambio sobre o obxecto asociado cun clon afecta ao obxecto orixinal, porque os obxectos relacionados son os mesmos (e dicir, a clonación replica só o propio obxecto e o seu estado, non as súas asociacións con terceiros obxectos), mentres que na clonación profunda clónanse os obxectos e tamén os seus obxectos relacionados.

Negociador de produtos

Unha modificación ou derivación deste padrón é o Negociador de Produtos (Product Trader), que se centra no tratamento dos prototipos cando varios clientes traballan sobre eles. Este padrón incorpora un xestor, xeralmente utilizando o patron singleton, que actúa sobre un conxunto de prototipos fronte aos clientes.

Inclusión

Esta sería a inclusión en Java do exemplo proposto:

/**
 * A clase cliente constrúe un obxecto e realiza operacións
 * sen coñecer de forma explícita de que clase é o obxecto (só coñece
 * que descende do prototipo Figura)
 */
public class Cliente {

  // O construtor do cliente establece que prototipo vai usarse
  // nas clonacións

  public Cliente(Figura proto) {
    establecerPrototipo(proto);
  }

  // Método que permite cambiar o prototipo. Adicionalmente interroga
  // ao prototipo acerca da clase á que pertence

  public void establecerPrototipo(Figura proto) {
    System.out.println("Utilizando un prototipo de "
                           + proto.obterClase()
                           + " para construír obxectos");
    _proto = proto;
  }

  // Este método constrúe unha réplica do prototipo, visualiza o seu
  // estado, altérao e visualiza novamente o seu estado. En ningún
  // momento resulta necesario referirnos á clase concreta do obxecto.
  // O prototipo tras a invocación permanece sen alteracións.

  public void construir() {
    Figura p = _proto.clonar();

    System.out.println("[Antes] " + p.info() );
    p.aumentarTamaño();
    System.out.println("[Despois] " + p.info() );
    System.out.println("[Proto] " + _proto.info() );
  }

  //------- privadas ------

  private Figura _proto;
}
/**
 * Esta é a clase abstracta que representa a interface dos
 * obxectos que incorporan a operación de clonación fundamental
 * para o prototipado.
 */
public abstract class Figura {

  // O construtor do prototipo almacena nun atributo privado
  // un nome para o obxecto. Dito nome pode ser accesible
  // desde as subclases utilizando obterNome()

  public Figura(String nome)  {
      _nome = nome;
  }

  protected String obterNome() {
      return _nome;
  }

  // Este método abstracto permite obter unha réplica de calquera
  // obxecto subclase de Prototipo

  public abstract Figura clonar();

  // Algúns métodos que deben ser definidos ou poden redefinirse
  // nas clases derivadas

  public abstract void aumentarTamaño();

  public abstract String obterEstado();

  public String obterClase() {
      return "Figura";
  }

  // Este método fai uso dos métodos redefinidos polas subclases

  public String info() {
    return ("Obxecto " + _nome
                      + " (" + obterClase() + ")"
                      + " Estado: " + obterEstado() ); }

  //------ privadas -----

  private String _nome;
}
/**
 * A clase Rectangulo estende ao prototipo. O seu estado está constituído
 * polo alto e o ancho do rectángulo, así como o ángulo de rotación
 */
public class Rectangulo extends Figura {

  // O construtor do rectángulo á parte de inicializar a parte de figura
  //inicializa ancho e alto e establece un ángulo de rotación por defecto

  public Rectangulo(String nome, double ancho, double alto) {
    super(nome);
    _ancho = ancho;
    _alto = alto;
    establecerAngulo(0.0);
  }

  // Redefinición dos métodos proporcionados pola interface Figura

  public void aumentarTamaño() {
    _ancho = _ancho * 2;
    _alto = _alto * 2;
  }

  public String obterEstado() {
    return ("Ancho=" + _ancho + ", Alto=" + _alto + ", Angulo=" + _angulo );
  }

  public String obterClase() {
      return "Rectangulo";
  }

  // Este é un método adicional que está presente só nas instancias de
  // Rectángulo e que permite modificar o estado deste (ángulo)

  void establecerAngulo(double angulo) {
      _angulo = angulo;
  }

  // clonación de rectángulos. A dificultade adicional é a necesidade de crear
  // en primeiro lugar un rectángulo e logo modificar o estado no inicializado

  public Figura clonar() {
    Rectangulo r = new Rectangulo(obterNome(), _ancho, _alto);
    r.establecerAngulo(_angulo);
    return r;
  }

  //------- privadas ----------
  private double _ancho, _alto, _angulo;
}
/**
 * A clase Circulo estende ao prototipo. O seu estado está constituído
 * polo radio do círculo
 */
public class Circulo extends Figura {

  // O construtor do círculo á parte de inicializar a parte
  // do prototipo (super), inicializa o radio

  public Circulo(String nome, double radio) {
    super(nome);
    _radio = radio;
  }

  // Redefinición dos métodos proporcionados pola interface Prototipo

  public void aumentarTamaño() {
      _radio = 2.0 * _radio;
  }

  public String obterEstado() {
      return ("Radio=" + _radio);
  }

  public String obterClase() {
      return "Circulo";
  }

  // A clonación consiste en crear un obxecto con igual nome
  // e igual radio e devolvelo

  public Figura clonar() {
    return (new Circulo(obterNome(), _radio));
  }

  //------- privadas -------

  private double _radio;
}

Exemplo de inclusión de clonación en profundidade

public class Celula implements Cloneable{

    Nucleo nucleo = new Nucleo();

    public Celula(){

    }

    public Object clon(){

        Nucleo clon = (Nucleo)super.clone();

        clon.nucleo = new Nucleo(); //nova referencia

        return clon;

    }
}

Exemplo de inclusión de clonación superficial:

public class Celula implements Cloneable {

    Nucleo nucleo = new Nucleo();

    public Celula() {}

    public Object clone() {

        return super.clone();

    }
}

public class Nucleo implements Cloneable {

    AcidoNucleico acidoNucleico = new AcidoNucleico();

    public Nucleo() {}

    // código da clase Nucleo
}

Read other articles:

Якопоне да Тодиитал. Jacopone da Todi Якопоне да Тоди. Паоло Уччелло (1435—1440, Флоренция) Имя при рождении итал. Jacopo dei Benedetti Дата рождения 1236 Место рождения Тоди, Перуджа, Умбрия, Италия[1] Дата смерти 25 декабря 1306 Место смерти Коллаццоне, Перуджа, Умбрия, Италия[1] Р...

 

 

Halaman ini berisi artikel tentang konsep agama dan metafisika. Untuk karakter Marvel Comics, lihat Ex Nihilo (komik). Pohon Kehidupan karya Eli Content. Pohon Kehidupan, atau Etz haChayim (עץ החיים) dalam bahasa Ibrani, adalah sebuah simbol mistik yang dipakai dalam Kabbalah dari Yudaisme esoterik untuk menyebut sebuah susunan dari HaShem dan wadah dimana Ia menciptakan dunia ex nihilo (muncul dari ketiadaan), Museum Joods Historisch. Lihat entri ex nihilo di kamus bebas Wiktionary. E...

 

 

Kedutaan Besar Republik Indonesia di ParamariboKoordinat5°49′35″N 55°11′33″W / 5.8265°N 55.19238°W / 5.8265; -55.19238Lokasi Paramaribo, SurinameAlamatVerlengde Gemenelandsweg 141Paramaribo, SurinameDuta BesarJulang PujiantoYurisdiksi Suriname GuyanaSitus webkemlu.go.id/paramaribo/id Kedutaan Besar Republik Indonesia di Paramaribo (KBRI Paramaribo) adalah misi diplomatik Republik Indonesia untuk Republik Suriname dan merangkap sebagai perwakilan I...

Television channel ESA TelevisionBroadcast areaEuropeOwnershipOwnerEuropean Space AgencyLinksWebsiteESA Television ESA Television is the television network of the European Space Agency. It is a satellite-only broadcast network which periodically transmits programming via Eutelsat's Eutelsat 9A satellite to Europe, North Africa, and the Middle East as part of the Europe by Satellite public information service. In addition, live events are transmitted via different Eutelsat satellites covering...

 

 

Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus. Cet article peut contenir une synthèse inédite de sources non directement liées au sujet de l'article ou de sources primaires (janvier 2024). Vous pouvez aider en ajoutant des sources secondaires centrées sur le sujet de l'article ou en supprimant le contenu problématique. Voir la page de discussion pour plus de détails. Une famille occidentale dans l'Oregon. Le milieu humain de l'Occident, à Paris. La soc...

 

 

Kangxi Tongbao(康熙通寶)Dinasti Qing(Tiongkok)Nilai1 wénKomposisiLakur tembaga (kuningan)Tahun pencetakan1661–1722DepanDesainKangxi Tongbao (康熙通寶)BelakangDesainLihat di bawah. Kangxi Tongbao (Hanzi sederhana: 康熙通宝; Hanzi tradisional: 康熙通寶; Pinyin: kāng xī tōng bǎo) mengacu kepada sebuah inskripsi yang digunakan pada uang koin zaman Dinasti Qing Manchu yang diproduksi di bawah masa kekuasaan Kaisar Kangxi. Di bawah kekuasaan Kaisar Kangxi, bobot d...

Пётр I Мушатмолд. Петру Мушат Господарь, Воевода 1375 — декабрь 1391 Предшественник Костя (Штефан) или Мушата (Маргарита) (регент) или Джюрджю(претендент) Преемник Роман I Мушат первый из правителей династии Мушатинов Рождение XIV век Смерть 1391(1391) Род Мушаты (Мушатины) Отец Ко...

 

 

Torneo di Wimbledon 1974Doppio misto Sport Tennis Vincitori Billie Jean King Owen Davidson Finalisti Lesley Charles Mark Farrell Punteggio 6–3, 9–7 Tornei Singolare uomini donne   ragazzi ragazze Doppio uomini donne misto 1973 1975 Voce principale: Torneo di Wimbledon 1974. Billie Jean King e Owen Davidson erano i detentori del titolo e sono riusciti a difenderlo superando in finale Lesley Charles e Mark Farrell col punteggio di 6–3, 9–7, è stato il quarto titolo per la coppia....

 

 

Primary draft by Major League Baseball teams to assign amateur players For the most recent draft, see 2023 Major League Baseball draft. The 2023 Major League Baseball draft was held at Lumen Field. The Major League Baseball draft (officially the Rule 4 draft; also known as the First Year Player Draft) is the primary mechanism of Major League Baseball (MLB) for assigning amateur baseball players from high schools, colleges, and other amateur baseball clubs to its teams.[1] The draft or...

إدارة  خريطة توضح دول العالم التي لديها أقسام كتقسيمات إدارية.    تعديل مصدري - تعديل   الإدارة (بالإنجليزية: Department)‏، هو تقسيم إداري أو سياسي في العديد من الدول. الإدارات هي التقسيمات من المستوى الأول في 11 دولة، تسعة منها في الأمريكتين واثنان في أفريقيا. هناك 10 دول...

 

 

United Parcel Service, Inc. Тип Публичная компания Листинг на бирже NYSE: UPS Основание 1907 Основатели Джеймс Кейси[d] Расположение  США: Атланта (Джорджия) Ключевые фигуры Уильям Джонсон (председатель совета директоров)Кэрол Томе (CEO) Отрасль Транспортные услуги Продукция экспресс-дос�...

 

 

район[1] / муниципальный округ[2]Свечинский районСвечинский муниципальный округ Флаг Герб 58°16′00″ с. ш. 47°30′00″ в. д.HGЯO Страна  Россия Входит в Кировскую область Адм. центр пгт Свеча Глава муниципального округа Гоголева Галина Сергеевна[3] Председ...

Arizona Cardinals Musim saat iniDidirikan 1898; 125 tahun lalu (1898)Bermain di Stadion Universitas Phoenix Glendale, ArizonaKantor pusat di Tempe, Arizona Arizona Cardinals logoLogoAfiliasi liga National Football League (1920–sekarang) Western Division (1933–1949) American Conference (1950–1952) Eastern Conference (1953–1969) Century Division (1967–1969) National Football Conference (1970–sekarang) NFC East (1970–2001) NFC West (2002–sekarang) Seragam saat iniWarna t...

 

 

UFC mixed martial arts event in 2018 UFC 232: Jones vs. Gustafsson 2The poster for UFC 232: Jones vs. Gustafsson 2InformationPromotionUltimate Fighting ChampionshipDateDecember 29, 2018 (2018-12-29)VenueThe ForumCityInglewood, CaliforniaAttendance15,862[1]Total gate$2,066,604[1]Event chronology UFC on Fox: Lee vs. Iaquinta 2 UFC 232: Jones vs. Gustafsson 2 UFC Fight Night: Cejudo vs. Dillashaw UFC 232: Jones vs. Gustafsson 2 was a mixed martial arts event produc...

 

 

First set of teeth in diphyodonts Baby teeth redirects here. For other uses, see Baby teeth (disambiguation). Milk teeth redirects here. For the musical ensemble, see Milk Teeth (band). This article is primarily about deciduous teeth, but some or much of the information is also applicable to other diphyodonts including most mammals. Deciduous teethCross-section of upper and lower jaws with permanent teeth located above and below the deciduous teeth prior to their exfoliation. The deciduous ma...

Ghulam Mustafa KhanInformasi latar belakangLahir(1931-03-03)3 Maret 1931Badayun, Provinsi Bersatu Agra dan Oudh, India Britania (sekarang Uttar Pradesh, India)Meninggal17 Januari 2021(2021-01-17) (umur 89)Mumbai, IndiaGenreMusik klasik HindustaniPekerjaanPenyanyiTahun aktif1952–2021LabelSaregama, Tips Music, Magnasound Media, Universal Music, Sony Music, T Series, Saga Music, Nimbus Records, Navras Records.Situs webSitus resmi Ustad Ghulam Mustafa Khan (3 Maret 1931 – 1...

 

 

Luisa Vehil Luisa Vehil en Los tres berretines (1933).Información personalNacimiento 12 de noviembre de 1912[1]​ Montevideo, UruguayFallecimiento 24 de octubre de 1991(78 años) Buenos Aires, ArgentinaSepultura Cementerio de la ChacaritaNacionalidad ArgentinaFamiliaMadre Juana Tressols Cónyuge Sr. BullrichFamiliares Miguel Ángel Solá (sobrino)Información profesionalOcupación Actriz Años activa hasta 1991Rol debut Los tres berretinesDistinciones Premio Konex de Brillante (198...

 

 

Ciro De CesareNazionalità Italia Altezza178 cm Peso70 kg Calcio RuoloAllenatore (ex attaccante) Squadra Ebolitana Termine carriera19 dicembre 2013 - giocatore CarrieraSquadre di club1 1990-1994 Cavese9+ (1+)1994-1995 Boys Caivanese21 (3)1995-1996 Turris31 (4)1996-1997 Casarano33 (4)1997-1998 Salernitana30 (5)1998-2000 Chievo46 (13)2000 Salernitana16 (4)2000-2001 Chievo38 (8)2001→  Siena14 (1)2002→  Spezia14 (3)2002-2003 Com...

Der Titel dieses Artikels ist mehrdeutig. Weitere Bedeutungen sind unter Samoa (Begriffsklärung) aufgeführt. Unabhängiger Staat Samoa Mālō Saʻoloto Tūtoʻatasi o Sāmoa (samoanisch)Independent State of Samoa (englisch) Flagge Wappen Wahlspruch: Faʻavae i le Atua Sāmoa„Samoa ist gegründet auf Gott“ Amtssprache Samoanisch und Englisch Hauptstadt Apia Staats- und Regierungsform parlamentarische Republik Staatsoberhaupt O le Ao o le Mālō Vaʻaletoa Sualauvi II. Regierungschef Pre...

 

 

トップサーロイン トップサーロインは、サーロインの真ん中から上にあるが、テンダーロインは含まない種類 ビーフステーキテンプレートを表示 オニオンリングを乗せたトップサーロインのステーキ トップサーロイン(Top sirloin)は、牛肉の部位の1つである。サーロインから骨とテンダーロイン、ボトムサーロインを除いたもので、主に中臀筋と大腿二頭筋からなる。 �...