1 Обзор
Шаблон Builder (Шаблон Строителя) в основном используется для «шагового построения сложного объекта», в котором «шаг за шагом» является стабильным алгоритмом, в то время как различные части сложного объекта часто меняются. Поэтому шаблон построителя в основном используется для решения меняющихся требований к «части объекта». Это позволяет более детально контролировать процесс строительства объекта.
2 примера
Если взять в качестве примера производство мобильных телефонов, то каждый мобильный телефон делится на экран, процессор и аккумулятор. Сейчас будут производиться два типа мобильных телефонов: Apple и Samsung.
яблоко:
Скопируйте код кода следующим образом:
пакет org.scott.builder.before.use;
импортировать java.util.ArrayList;
импортировать java.util.List;
/**
* @автор Скотт
* @версия от 20 ноября 2013 г.
* @описание
*/
общественный класс ApplePhone {
Части List<String> = new ArrayList<String>();
общественный недействительный createCPU () {
parts.add("КУБОК: Qualcomm");
}
общественный недействительный createScreen () {
parts.add("ЭКРАН: JDI");
}
общественный недействительный createBattery () {
parts.add("АККУМУЛЯТОР: ДеСай");
}
публичное недействительное шоу(){
System.out.print("Информация о компонентах продукта:");
for(Часть строки: части){
System.out.print(часть + "/t");
}
}
}
Samsung:
Скопируйте код кода следующим образом:
пакет org.scott.builder.before.use;
импортировать java.util.ArrayList;
импортировать java.util.List;
/**
* @автор Скотт
* @версия от 20 ноября 2013 г.
* @описание
*/
общественный класс SamsungPhone {
Части List<String> = new ArrayList<String>();
общественный недействительный createCPU () {
parts.add("ЧАШКА: MTK");
}
общественный недействительный createScreen () {
parts.add("ЭКРАН: Samsung");
}
общественный недействительный createBattery () {
parts.add("АККУМУЛЯТОР: ДеСай");
}
публичное недействительное шоу(){
System.out.print("Информация о компонентах продукта:");
for(Часть строки: части){
System.out.print(часть + "/t");
}
}
}
Тестовый клиент:
Скопируйте код кода следующим образом:
пакет org.scott.builder.before.use;
/**
* @автор Скотт
* @версия от 20 ноября 2013 г.
* @описание
*/
общественный класс BuilderTest {
частный статический ApplePhone iphone = новый ApplePhone();
частный статический SamsungPhone samPhone = новый SamsungPhone();
public static void main(String args[]){
iphone.createCPU();
iphone.createScreen();
iphone.createBattery();
iphone.шоу();
samPhone.createCPU();
samPhone.createScreen();
samPhone.createBattery();
самТелефон.шоу();
}
}
Вы нашли проблему? То есть все процессы производства мобильных телефонов одинаковы. Если быть точным, названия процессов одинаковы, но конкретная обработка каждого процесса отличается. Процесс остается неизменным. Конкретных шагов всего несколько. обработка каждого изменения процесса, из этого мы можем извлечь неизменное, «неизменное, чтобы справиться со всеми изменениями», и передать изменение конкретным продуктам.
Как это сделать конкретно? На этот раз вам пригодится режим «Строитель».
Для начала давайте взглянем на интерфейс телефона:
Скопируйте код кода следующим образом:
пакет org.scott.builder.after.use;
импортировать java.util.ArrayList;
импортировать java.util.List;
/**
* @автор Скотт
* @версия от 20 ноября 2013 г.
* @описание
*/
публичный абстрактный класс Phone {
защищенные части List<String> = новый ArrayList<String>();
public void add (строковая часть) {
parts.add(часть);
}
публичное недействительное шоу(){
System.out.print("Информация о компонентах продукта:");
for(Часть строки: части){
System.out.print(часть + "/t");
}
}
}
Категория мобильных телефонов Apple:
Скопируйте код кода следующим образом:
пакет org.scott.builder.after.use;
/**
* @автор Скотт
* @версия от 20 ноября 2013 г.
* @описание
*/
публичный класс ApplePhone расширяет Phone{
}
Категория мобильных телефонов Samsung:
Скопируйте код кода следующим образом:
пакет org.scott.builder.after.use;
/**
* @автор Скотт
* @версия от 20 ноября 2013 г.
* @описание
*/
публичный класс SamsungPhone расширяет Phone{
}
Затем определите построитель интерфейса для производственного этапа:
Скопируйте код кода следующим образом:
пакет org.scott.builder.after.use;
/**
* @автор Скотт
* @версия от 20 ноября 2013 г.
* @описание
*/
Разработчик общедоступного интерфейса {
общественный недействительный buildCPU ();
общественный недействительный buildScreen ();
общественный недействительный buildBattery ();
общественный телефон getPhone();
}
Конструктор для iPhone:
Скопируйте код кода следующим образом:
пакет org.scott.builder.after.use;
/**
* @автор Скотт
* @версия от 20 ноября 2013 г.
* @описание
*/
публичный класс ApplePhoneBuilder реализует Builder{
частный телефон phone = новый ApplePhone();
@Override
общественный недействительный buildCPU () {
phone.add("КУБОК: Qualcomm");
}
@Override
общественный недействительный buildScreen () {
phone.add("ЭКРАН: JDI");
}
@Override
общественный недействительный buildBattery () {
phone.add("БАТАРЕЯ: ДеСай");
}
@Override
общественный телефон getPhone() {
вернуть телефон;
}
}
Конструктор для мобильных телефонов Samsung:
Скопируйте код кода следующим образом:
пакет org.scott.builder.after.use;
/**
* @автор Скотт
* @версия от 20 ноября 2013 г.
* @описание
*/
публичный класс SamsungPhoneBuilder реализует Builder{
частный телефон phone = новый SamsungPhone();
@Override
общественный недействительный buildCPU () {
phone.add("КУБОК: MTK");
}
@Override
общественный недействительный buildScreen () {
phone.add("ЭКРАН: Samsung");
}
@Override
общественный недействительный buildBattery () {
phone.add("БАТАРЕЯ: ДеСай");
}
@Override
общественный телефон getPhone() {
вернуть телефон;
}
}
Директор, курирующий конкретное производство мобильных телефонов:
Скопируйте код кода следующим образом:
пакет org.scott.builder.after.use;
/**
* @автор Скотт
* @версия от 20 ноября 2013 г.
* @описание
*/
директор публичного класса {
частный застройщик застройщик;
общественный директор(строитель-строитель){
this.builder = строитель;
}
публичная недействительная конструкция(){
строитель.buildCPU();
builder.buildScreen();
builder.buildBattery();
}
}
Наконец, напишите тестовый класс:
Скопируйте код кода следующим образом:
пакет org.scott.builder.after.use;
/**
* @автор Скотт
* @версия от 20 ноября 2013 г.
* @описание
*/
общественный класс BuilderTest {
частный статический Builder iPhoneBuilder = новый ApplePhoneBuilder();
частный статический Builder samPhoneBuilder = новый SamsungPhoneBuilder();
public static void main(String[] args) {
Директор-директор = новый директор(iPhoneBuilder);
директор.конструкт();
Телефон phone = iPhoneBuilder.getPhone();
System.out.println("iphone");
телефон.шоу();
директор = новый директор (samPhoneBuilder);
директор.конструкт();
телефон = samPhoneBuilder.getPhone();
System.out.println("/nsamSung");
телефон.шоу();
}
}
Результаты запуска:
Скопируйте код кода следующим образом:
айфон
Информация о детали продукта: ЧАШКА: Qualcomm ЭКРАН: JDI АККУМУЛЯТОР: DeSai
Samsung
Информация о детали продукта: ЧАШКА: MTK ЭКРАН: Samsung АККУМУЛЯТОР: DeSai
Два класса сущностей Phone здесь пусты. В этом случае их можно опустить. Если интерфейс Phone также можно опустить, остаются только классы реализации Director, Builder и определенные Builder. Более того, класс ApplePhone и класс SamsungPhone — это два родственных класса. Это разные марки мобильных телефонов. Если вы встретите два или более классов, которые не очень связаны, в существовании общедоступного интерфейса Phone нет необходимости. , Так как же определить возвращаемое значение метода getPhone(), указанного в интерфейсе Builder?
Независимо от того, является ли тип возвращаемого значения ApplePhone или SamsungPhone, возникнут проблемы, поскольку типы возвращаемых результатов неодинаковы. На данный момент Phone можно определить как пустой интерфейс (интерфейс, который не содержит никаких методов), а затем позволить этим конкретным классам продуктов, не имеющим связи друг с другом, реализовать этот интерфейс. Затем тип возвращаемого значения getPhone(. ) метод, указанный в интерфейсе Builder. Это по-прежнему тип телефона, что решает проблему. Однако в этом случае нет необходимости использовать режим Builder.