1. Обзор
В целом, шаблоны дизайна разделены на три категории:
(1) Творческий режим , в общей сложности пять типов: режим заводского метода, абстрактный заводский режим, режим синглтона, режим строительства и режим прототипа.
(2) Структурные режимы , в общей сложности семь типов: режим адаптера, режим декоратора, прокси -режим, режим внешнего вида, режим моста, режим комбинации и режим удовольствия.
(3) Поведенческий режим , в общей сложности одиннадцать: режим политики, режим метода шаблона, режим наблюдения, итеративный подмодок, режим цепочки ответственности, режим команд, режим памяти, режим состояния, режим посетителя, режим промежуточного и интерпретатор.
2. Шесть принципов модели дизайна
1. Открыть принцип закрытия
Принцип открытия и закрытия состоит в том, чтобы открыть для расширения и близкие к модификациям. Когда программа должна быть расширена, вы не можете изменить исходный код для достижения эффекта горячей пробки.
2. Принцип замены Лискова
Его официальное описание относительно абстрактно и может использоваться для Baidu. Фактически, это можно понять следующим образом: (1) способность подкласса должна быть больше или равна родительскому классу, то есть методы, которые может использовать родительский класс, и подкласс может использовать. (2) То же самое верно для возврата. Предположим, что метод родительского класса возвращает список, а подкласс возвращает Arraylist, что, конечно, можно сделать. Если метод родительского класса возвращает ArrayList, а класс ребенка возвращает список, это не имеет смысла. Здесь способность подклассов возвращать значения меньше, чем у родителей. (3) Есть также случаи, когда исключения бросаются. Любой метод подкласса может объявить подкласс, который бросает метод родительского класса, чтобы объявить исключение.
Он не может заявить, что исключение, которое родительский класс не объявил, брошено.
3. Принцип инверсии зависимости
Это является основой принципа открытия и закрытия, а также конкретного содержания: ориентированное на интерфейс программирование, полагаясь на абстракцию, а не конкретную.
4. Принцип сегрегации интерфейса
Этот принцип означает: использование нескольких изолированных интерфейсов лучше, чем использовать один интерфейс. Это также означает сокращение степени связи между классами. Отсюда мы видим, что шаблон проектирования на самом деле является дизайнерской идеей программного обеспечения, начиная с большой архитектуры программного обеспечения, для удобства обновления и обслуживания. Следовательно, приведенная выше статья появлялась много раз: уменьшить зависимость и уменьшить связь.
5. Demeter Principle
Почему принцип наименьшего знания? То есть одна сущность должна как можно меньше взаимодействовать с другими объектами, чтобы функциональные модули системы были относительно независимыми.
6. Принцип составного повторного использования
Принцип состоит в том, чтобы попытаться использовать методы синтеза/агрегации, а не наследование.
3. Режим создания
Существует пять типов режимов создания: режим заводского метода, абстрактный заводский режим, режим синглтона, режим строительства и режим прототипа.
3.1. Заводская модель метода
Режим заводского метода делится на три типа: обычный заводский режим, многократный режим метода заводских и статический метод фабрики.
3.1.1. Обычная заводская модель
Обычная заводская модель состоит в том, чтобы создать фабричный класс и создать экземпляры некоторых классов, которые реализуют один и тот же интерфейс.
пакет com.mode.create; Публичный интерфейс myInterface {public void print ();} пакет com.mode.create; открытый класс myClassone реализует myInterface {@Override public void print () {System.out.println ("myClassone"); }} пакет com.mode.create; открытый класс myClasstwo реализует myInterface {@Override public void print () {System.out.println ("myClasstwo"); }} пакет com.mode.create; public class myfactory {public myInterface продукт (тип строки) {if ("one" .equals (type)) {return new myClassone (); } else if ("два" .equals (type)) {return new myclasstwo (); } else {System.out.println ("Нет типа, чтобы быть найденным"); вернуть ноль; }}} пакет com.mode.create; открытый класс FactoryTest {public static void main (string [] args) {myFactory factory = new myFactory (); MyInterface myi = factory.produce ("One"); myi.print (); }}Я думаю, что результаты FactoryTest должны быть очевидны.
Давайте снова поймем это предложение: обычная заводская модель состоит в том, чтобы создать фабричный класс и создать экземпляры некоторых классов, которые реализуют один и тот же интерфейс.
3.1.2. Многочисленные режимы метода фабрики
Несколько режимов метода завода являются улучшением в режиме обычного фабричного метода. Многочисленные режимы метода завода предназначены для предоставления нескольких заводских методов для создания объектов отдельно.
Давайте посмотрим на код напрямую. Мы изменяем MyFactory и FactoryTest следующим образом:
пакет com.mode.create; открытый класс myFactory {public myInterface uefactOne () {return new myClassone (); } public myInterface productwo () {return new myclasstwo (); }} пакет com.mode.create; открытый класс FactoryTest {public static void main (string [] args) {myFactory factory = new myFactory (); MyInterface myi = factory.produceone (); myi.print (); }}Результаты работы также очень очевидны.
Давайте снова поймем это предложение: несколько режимов фабрики являются улучшением режима обычного метода фабрики. Многочисленные режимы метода завода предназначены для предоставления нескольких заводских методов для создания объектов отдельно.
3.1.3. Режим статического фабричного метода
Статический режим метода фабрики, установите методы в приведенных выше режимах методов Factory для статического, и нет необходимости создавать экземпляр, просто вызовите его напрямую.
Давайте посмотрим на код напрямую. Мы изменяем MyFactory и FactoryTest следующим образом:
пакет com.mode.create; открытый класс myFactory {public static myInterface uefactOne () {return new myClassone (); } public static myInterface provemetwo () {return new myclasstwo (); }} пакет com.mode.create; открытый класс factoryTest {public static void main (string [] args) {myInterface myi = myfactory.produceone (); myi.print (); }}Результаты операции все еще очень очевидны.
Просмотрите еще раз: режим статического заводского метода, установите методы в приведенных выше режимах методов заводских методов на статике, и нет необходимости создавать экземпляр, просто вызовите его напрямую.
3.2. Абстрактная заводская шаблон
Существует проблема с моделью метода фабрики, что создание класса зависит от заводских классов, то есть, если вы хотите расширить программу, вы должны изменить класс завода, что нарушает принцип закрытия.
Чтобы решить эту проблему, давайте посмотрим на абстрактный заводской шаблон: создать несколько заводских классов, чтобы, как только потребуются новые функции, вы можете напрямую добавить новые заводские классы, не изменяя предыдущий код.
Это соответствует принципу закрытия.
Давайте посмотрим на код ниже:
MyInterface, MyClassone, MyClasstwo остается неизменным.
Следующие интерфейсы и классы добавляются:
пакет com.mode.create; поставщик публичных интерфейсов {public myInterface uefact (); } пакет com.mode.create; открытый класс myFactoryOne реализует поставщик {@Override public myInterface ueform () {return new myClassone (); }} пакет com.mode.create; открытый класс myFactoryTwo реализует поставщик {@Override public myInterface ueform () {return new myclasstwo (); }}Изменить тестовый класс FactoryTest следующим образом:
пакет com.mode.create; открытый класс factoryTest {public static void main (string [] args) {провайдер поставщика = new myFactoryOne (); MyInterface myi = provider.produce (); myi.print (); }}Результаты операции все еще очевидны.
Обзор еще раз: Abstract Factory Pattern заключается в создании нескольких заводских классов, чтобы после необходимости новых функций вы можете напрямую добавить новые заводские классы, не изменяя предыдущий код.
3.3. Синглтон режим
Синглтон -шаблон, не нужно слишком много объяснений.
Просто посмотрите на код:
Пакет -тест; открытый класс myObject {private static myObject myObject; private myObject () {} public static myObject getInstance () {if (myObject! = null) {} else {myObject = new myObject (); } вернуть myObject; }}Тем не менее, это вызовет проблемы с мультипотчиком. Для получения подробного объяснения, вы можете увидеть главу 6 в книге «Основная технология многопоточного программирования Java».
3.4. Режим строителя
Образец застройщика: для отделения конструкции сложного объекта от его представления, чтобы один и тот же процесс строительства мог создавать разные представления.
Это выглядит очень абстрактно буквально, но на самом деле это также очень абстрактно! ! ! !
Режим застройщика обычно включает в себя следующие символы:
(1) Строитель: дайте абстрактный интерфейс для стандартизации построения различных компонентов объекта продукта. Этот интерфейс указывает, какие части сложных объектов создаются, и не включает в себя создание конкретных компонентов объекта.
(2) ConcreteBuilder: реализует интерфейс Builder и определяет создание различных частей сложных объектов для различной бизнес -логики. После завершения строительного процесса приведен пример продукта.
(3) Директор: вызывает конкретных строителей для создания различных частей сложных объектов. Преподаватель не включает в себя конкретную информацию о продукте, но отвечает только за то, чтобы все части объекта были созданы нетронутыми или в определенном порядке.
(4) Продукт: сложный объект, который будет создан.
Обычно строить злодеев в развитии игры, и требование: злодеи должны включать в себя головы, тело и ноги.
Давайте посмотрим на следующий код:
Продукт (комплексный объект, который будет создан.):
пакет com.mode.create; Public Class Person {Private String Head; частное тело; частная струнная нога; public String gethead () {return Head; } public void sethead (String Head) {this.head = Head; } public String getBody () {return Body; } public void setbody (строковое тело) {this.body = body; } public String getFoot () {return Foot; } public void setFoot (String Foot) {this.foot = foot; }} Строитель (дает абстрактный интерфейс для стандартизации построения различных компонентов объекта продукта. Этот интерфейс указывает, какие части сложного объекта создаются для реализации, и не включает в себя создание конкретных компонентов объекта.):
пакет com.mode.create; Public Interface Personbuilder {void buildhead (); void buildbody (); void buildfoot (); Человек Buildperson ();} ConceteBuilder (реализует интерфейс Builder, который воплощает в себе создание различных частей сложных объектов для различной бизнес -логики. После завершения процесса строительства приведен пример продукта.):
пакет com.mode.create; Открытый класс Manbuilder реализует PersonBuilder {Person Person; public manbuilder () {person = new Person (); } public void buildbody () {person.setbody («построить тело человека»); } public void buildfoot () {person.setFoot («построить ноги человека»); } public void buildhead () {person.sethead («построить голову человека»); } public Person BuildPerson () {return Person; }} Директор (позвоните в конкретный строитель, чтобы создать различные части сложных объектов. Преподаватель не включает конкретную информацию о продукте. Он отвечает только за то, чтобы части объекта были созданы неповрежденными или в определенном порядке.):
пакет com.mode.create; открытый класс Persondirector {Public Constructperson (PersonBuilder PB) {pb.buildhead (); Pb.buildbody (); pb.buildfoot (); вернуть pb.buildperson (); }} Тестовый класс:
пакет com.mode.create; открытый тест класса {public static void main (string [] args) {persondirector pd = new Persondirector (); Person Person = pd.constructperson (new Manbuilder ()); System.out.println (Person.getBody ()); System.out.println (Person.getFoot ()); System.out.println (person.gethead ()); }}Результаты работы:
Обзор: Сборник Строителя: для отделения конструкции сложного объекта от его представления, чтобы один и тот же процесс строительства мог создавать разные представления.
3.5. Прототип режим
Идея этого шаблона состоит в том, чтобы использовать объект в качестве прототипа, копировать и клонировать его и создать новый объект, аналогичный исходному объекту.
Говоря о копировании объектов, я расскажу об этом в сочетании с мелким копированием и глубоким копированием объектов. Прежде всего, вам нужно понять концепцию глубокого и мелкого копирования объектов:
Небольшая копия: после копирования объекта переменные базового типа данных будут воссозданы, а тип ссылки указывает на исходный объект.
Глубокая копия: После копирования объекта воссоздаются как основной тип данных, так и тип ссылки. Проще говоря, глубокое копирование полностью скопировано, в то время как мелкое копирование не является тщательным.
Напишите пример копирования глубины:
пакет com.mode.create; Импорт java.io.bytearrayinputstream; import java.io.bytearrayoutputstream; импорт java.io.ioexception; import java.io.objectInputStream; импорт java.io.objectOutputStream; import java.io.serializable; Прототип открытого класса реализует клонируемые, сериализуемые {частный статический окончательный длинный серийный сериал = 1L; частная база Int; частное целое число OBJ; /* Неглубокая копия*/ public Object Clone () Throws CloneNotsUpportedException {// Поскольку интерфейс клонируемого интерфейса является пустым интерфейсом, вы можете определить название метода класса реализации в Will // Clonea или CloneB, потому что фокус вот предложение Super.clone () // super.clone () Вызывает метод объекта). Прототип Proto = (прототип) super.clone (); вернуть прото; } /* Deep Copy* / public Object deepClone () Throws ioException, classNotFoundException { /* Напишите двоичный поток в текущий объект* / bytearRayoutputStream bos = new BytearRayOutputStream (); ObjectOutputStream oos = new objectOutputStream (bos); OOS.WriteObject (это); /* Прочитайте новый объект, сгенерированный двоичным потоком*/ bytearrayinptstream bis = new Bytearrayinptstream (bos.tobytearray ()); ObjectInputStream OIS = new ObjectInputStream (BIS); return ois.readobject (); } public int getBase () {return Base; } public void setbase (int base) {this.base = base; } public integer getObj () {return obj; } public void setObj (integer obj) {this.obj = obj; }} Тестовый класс:
пакет com.mode.create; импортировать java.io.ioexception; открытый тест класса {public static void main (string [] args) бросает клоненотсупорноэкспений, classnotfoundexception, ioException {prototype prototype = new Prototype (); Prototype.SetBase (1); Prototype.setObj (новое целое число (2)); /* мелкая копия*/ прототип прототипа1 = (прототип) прототип.clone (); /* Deep Copy*/ Prototype Prototype2 = (Prototype) Prototype.deepclone (); System.out.println (Prototype1.getObj () == Прототип1.getObj ()); System.out.println (Prototype1.getObj () == Prototype2.getObj ()); }}Результаты работы:
Выше приведено в этой статье, я надеюсь, что это будет полезно для каждого обучения.