Режим строителя
Определение также называется шаблоном генератора. Он может абстрагировать процесс строительства сложных объектов (абстрактные категории), так что различные методы реализации этого абстрактного процесса могут построить объекты с различными проявлениями (атрибуты).
Когда алгоритм создания сложного объекта должен быть независимым от компонентов этого объекта, и процесс строительства должен позволить созданному объекту иметь разные представления. Мы могли бы рассмотреть возможность использования режима строителя.
выполнить
1. Строитель определяет абстрактный интерфейс для каждого компонента, который создает объект продукта. Обычно он содержит абстрактные методы, которые создают и возвращают продукты, или это может быть конкретным методом, вставляющим процесс создания в класс ConcreteBuilder.
2. ConcreteBuilder реализует интерфейс Builder, чтобы построить и собирать различные компоненты продукта.
3. Директор отвечает за то, что вызывает соответствующий строитель для формирования продукта. Класс директоров, как правило, не зависит от класса продукта. Класс Builder напрямую взаимодействует с классом директоров.
4. Продукт представляет собой сложный объект, который будет построен. ConcreateBuilder создает внутреннее представление продукта и определяет его процесс сборки.
/ ** "Продукт"*/ класс pizza {private String togh = ""; частный струнный соус = ""; Приватная строка toping = ""; public void setDough (String togh) {this.dough = toough; } public void setSauce (String Sauce) {this.sauce = соус; } public void определение (String Toping) {this.Topping = toping; }} ''/** "Abstract Builder"*/'' Abstract Class PizzaBuilder {Protected Pizza Pizza; public pizza getpizza () {return pizza; } public void createPizzAproduct () {pizza = new Pizza (); } public Abstract void builddough (); общественный абстрактный void buildsauce (); Public Abstract void BuildTopping (); } / ** "ConceteBuilder"* / Class Hawaiianpizzabuilder Exters Pizzabuilder {public void builddough () {pizza.setdough ("cross"); } public void buildSauce () {pizza.setsauce ("mild"); } public void buildTopping () {pizza.setTopping ("ham+pineapple"); }} / ** "ConcreteBuilder"* / Class Spicypizzabuilder Exters Pizzabuilder {public void builddough () {pizza.setdough ("Pan Baked"); } public void buildSauce () {pizza.setsauce ("hot"); } public void buildTopping () {pizza.setTopping ("pepperoni+salami"); }} ''/** "Режиссер"*/'' Класс официант {prizzabuilder pizzabuilder; public void setpizzabuilder (Pizzabuilder Pb) {pizzabuilder = pb; } public pizza getpizza () {return pizzabuilder.getpizza (); } public void constructpizza () {pizzabuilder.createnewpizzAproduct (); pizzabuilder.builddough (); pizzabuilder.buildsauce (); pizzabuilder.buildtopping (); }} /** Заказ для клиента пицца. */ class builderexample {public static void main (string [] args) {официант witer = new abiter (); Pizzabuilder hawaiian_pizzabuilder = new Hawaiianpizzabuilder (); Pizzabuilder spicy_pizzabuilder = new spicypizzabuilder (); Office.SetPizzaBuilder (Hawaiian_pizzabuilder); QuiTIER.Constructpizza (); Pizza Pizza = Quibiter.getPizza (); }}Клиент создает объект директора и настраивает его с объектом Builder, который он хочет. Директор получает запрос клиента о создании продукта и, наконец, получает продукт.
преимущество
1. Процесс построения объектов может быть тщательно контролироваться для создания различных объектов продукта.
2. Легко расширить. Когда появится новый продукт, вы можете просто добавить новый бетонный задумчик для его достижения.
Связанный шаблон абстрактный заводской шаблон аналогичен генераторам, потому что он также может создавать сложные объекты. Основное отличие заключается в том, что шаблон генератора фокусируется на построении сложного объекта шаг за шагом. Абстрактная заводская модель фокусируется на нескольких сериях объектов продукта (простые или сложные).
Генератор возвращает продукт на последнем шаге, а для абстрактной фабрики продукт немедленно возвращается.
Прототип режим
Определение шаблона прототипа - это тип шаблона создания, который характеризуется «копированием» существующего экземпляра для возврата нового экземпляра, а не создания нового экземпляра. Скопированный пример - это то, что мы называем «прототипом», который настраивается.
Режим прототипа в основном используется для создания сложных или трудоемких экземпляров, потому что в этом случае копирование существующего экземпляра заставляет программу работать более эффективно; или создание равных значений, просто называет разные похожие данные.
выполнить
1. Клиент - Создайте новый объект, а затем получите другой объект через клон.
2. Прототип - Определите собственный абстрактный метод клона.
3. ConcretePrototype - реализовать метод клона.
Прототип публичного интерфейса {public абстрактный объект Clone (); } public Class ConcretePrototype реализует прототип {public Object Clone () {return super.clone (); }} public Class Client {public static void main (string arg []) {concetePrototype obj1 = new ConcetePrototype (); ConcretePrototype obj2 = concreteprototype) obj1.clone (); }} Пример
1. Многие элементы в игре повторяются, и мы можем использовать режим прототипа для копирования тех же элементов.
2. При создании диаграмм данных, в первый раз, когда нам нужно прочитать данные из базы данных и сохранить их в объект. Когда нам нужно сделать другие диаграммы одних и тех же данных, использование режима прототипа может избежать перечитывания базы данных.
Связанные вопросы и реализации
1. Если количество созданных прототипов не исправлено, вы можете создать менеджер прототипа. Перед копированием объекта прототипа клиент сначала проверяет, есть ли объекты прототипа, которые соответствуют условиям в менеджере прототипа. Если есть, он будет использовать его напрямую. Если нет, клонировать один. Это называется регистрационной формой режима прототипа.
2. Есть два типа копирования: глубокая копия и мелкая копия. При копировании объект копирования и объект прототипа совместно используют все внутренние переменные объекта, и эти два объекта имеют одинаковое пространство памяти и жизненный цикл. Модификация объекта прототипа также изменяет его копию и наоборот.
В Java, если вы реализуете клонируемый интерфейс, вы можете вызвать метод клона класса объекта для достижения мелкого копирования:
открытый класс мелководье реализует клонируемый {int ровь; Человек; public void setage (int age) {this.age = age; } public void setperson (String name) {person = new Person (имя); } public Object Clone () Throws ClonenotSupportedException {// Java -по умолчанию реализует неглубокую копию return super.clone (); }} public Class Person {string name; Public Perform (String name) {this.name = name; }} Общедоступный тест класса {public static void main (string [] args) бросает clonenotsupportedException {shallowclone oldshallowclone = new mallowclone (); OldShallingClone.Setage (20); OldshallyClone.SetPerson ("Eric"); System.out.println ("OldName:" + OldShallingClone.person.name + "AGE:" + OldshallowClone.age); Неглубокий клон newshallyclone = (неглубокий) oldshallowclone.clone (); System.out.println ("newname:" + newshallingclone.person.name + "age:" + newshallowclone.age); OldShallingClone.age = 30; Oldshallingclone.person.name = "frank"; System.out.println ("newname:" + newshallingclone.person.name + "age:" + newshallowclone.age); }} Выход:
OldName: Eric Age: 20newName: Eric Age: 20NewName: Frank Age: 20
Видно, что копирование объекта является ссылкой на объект. Когда значение объекта будет изменено, скопированный объект также изменится, а основной тип Java является скопированным значением.
Ниже мы реализуем глубокую копию:
открытый класс DeepClone {int возраст; Человек; public void setage (int age) {this.age = age; } public void setperson (String name) {person = new Person (имя); } public deepClone (DeepClone DeepClone) {this.age = deepClone.age; this.person = новый человек (deepclone.person.name); } public deepClone () {} public Object Clone () бросает ClonenotSupportedException {return new DeepClone (this); }} public class test {public static void main (string [] args) бросает clonenotsupportedException {deepClone OldDeepClone = new DeepClone (); OldDeepClone.Setage (20); OldDeepClone.SetPerson ("Eric"); System.out.println ("OldName:" + OldDeepClone.person.name + "Age:" + OldDeepClone.age); DeepClone newdeepclone = (DeepClone) OldDeepClone.clone (); System.out.println ("newname:" + newdeepclone.person.name + "age:" + newdeepclone.age); OldDeepClone.age = 30; OldDeepclone.person.name = "frank"; System.out.println ("newname:" + newdeepclone.person.name + "age:" + newdeepclone.age); }} Выход:
OldName: Eric Age: 20newname: Eric Age: 20newname: Eric Age: 20
В приведенном выше методе копии мы воссоздали объект и воссоздали ссылку на реализацию Deep Copy.
преимущество
1. Копирование лучше нового.
2. Упростить или скрыть детали создания объектов и копировать их напрямую.