Фабричный способ шаблона
резюме
- абстрактный класс продукта
- Несколько определенных категорий продуктов
- абстрактная фабрика
- Несколько конкретных фабрик - каждый конкретный продукт соответствует определенной фабрике
- встречает -OCP открытый закрытый принцип
преимущество
- Уменьшите степень связанности кода, а генерация объектов будет передана подклассам для завершения.
- Реализует принцип открытости и закрытости — каждый раз, когда вы добавляете подпродукт, вам не нужно изменять исходный код.
недостаток
- Увеличивает объем кода, для каждого конкретного продукта требуется конкретная фабрика
- При добавлении абстрактного продукта, то есть добавлении еще одного семейства продуктов, фабрику необходимо модифицировать, что нарушает OCP.
Дальнейшая интерпретация точки зрения кода
Абстрактный класс продукта
/**
* @author cuishifeng
* @create 2018-08-02
**/
public interface Computer {
/**
* 生产电脑
*/
void createComputer();
}
конкретный продукт
/**
* @author cuishifeng
* @create 2018-08-02
**/
public class Cpu implements Computer {
@Override
public void createComputer() {
System.out.println("生产cpu");
}
}
/**
* @author cuishifeng
* @create 2018-08-02
**/
public class Disk implements Computer {
@Override
public void createComputer() {
System.out.println("生产磁盘disk");
}
}
/**
* @author cuishifeng
* @create 2018-08-02
**/
public class Displayer implements Computer {
@Override
public void createComputer() {
System.out.println("生产显卡displayer");
}
}
абстрактный фабричный класс
/**
* @author cuishifeng
* @create 2018-08-02
**/
public interface ComputerFactory {
/**
* 工厂方法模式的抽象工厂
* @return
*/
Computer getProduct();
}
конкретная фабрика
/**
* @author cuishifeng
* @create 2018-08-02
**/
public class CpuFactory implements ComputerFactory {
@Override
public Computer getProduct() {
return new Cpu();
}
}
/**
* @author cuishifeng
* @create 2018-08-02
**/
public class DiskFactory implements ComputerFactory{
@Override
public Computer getProduct() {
return new Disk();
}
}
/**
* @author cuishifeng
* @create 2018-08-02
**/
public class DisplayerFactory implements ComputerFactory {
@Override
public Computer getProduct() {
return new Displayer();
}
}
/**
* 客户端
* @author cuishifeng
* @create 2018-08-02
**/
public class AppClient {
public static void main(String[] args) {
ComputerFactory computerFactory = new CpuFactory();
computerFactory.getProduct().createComputer();
System.out.println("---------------------------- ");
computerFactory = new DiskFactory();
computerFactory.getProduct().createComputer();
System.out.println("---------------------------- ");
computerFactory = new DisplayerFactory();
computerFactory.getProduct().createComputer();
}
}
распечатать результат
生产cpu
----------------------------
生产磁盘disk
----------------------------
生产显卡displayer
Process finished with exit code 0
Абстрактный заводской узор
резюме
- Несколько абстрактных продуктов
- конкретная категория продуктов
- класс абстрактной фабрики - объявляет (набор) методов, которые возвращают абстрактный продукт
- Класс Бетонный завод - производит (набор) бетонных изделий
преимущество
- развязка кода
- Внедрите несколько семейств продуктов (семейство, состоящее из связанных продуктов), в то время как один продукт шаблона фабричного метода может удовлетворить больше производственных потребностей.
- Он очень хорошо удовлетворяет принципам открытого и закрытого OCP.
- В шаблоне абстрактной фабрики мы можем определить и реализовать более одного интерфейса, и фабрика также может генерировать более одного класса продукта.Это довольно гибко и легко расширять производство сложных объектов.
недостаток
1. Расширение семейства продуктов достаточно хлопотно и расширение семейства продуктов нарушит OCP, т.к. необходимо модифицировать все фабрики.Например, у нас есть семейство продуктов, состоящее из компьютера и мыши.После написания кода, добавить клавиатуру будет очень хлопотно.Прочитав следующий код разберетесь
2. Поскольку шаблон абстрактной фабрики является расширением шаблона фабричного метода, он, как правило, громоздкий.
Дальнейшая интерпретация точки зрения кода
абстрактный продукт
/**
* 计算机-抽象产品类
* @author cuishifeng
* @create 2018-08-02
**/
public abstract class Computer {
/**
* 生产计算机
*/
public abstract void productComputer();
}
/**
* 鼠标 - 抽象产品类
* @author cuishifeng
* @create 2018-08-02
**/
public abstract class Mouse {
/**
* 生产鼠标
*/
public abstract void productMouse();
}
конкретный продукт
/**
* PC计算机具体产品类
* @author cuishifeng
* @create 2018-08-02
**/
public class PcComputer extends Computer {
@Override
public void productComputer() {
System.out.println("PC端计算机");
}
}
/**
* @author cuishifeng
* @create 2018-08-02
**/
public class ServerComputer extends Computer {
@Override
public void productComputer() {
System.out.println("Server端计算机");
}
}
/**
* @author cuishifeng
* @create 2018-08-02
**/
public class GameMouse extends Mouse {
@Override
public void productMouse() {
System.out.println("游戏鼠标");
}
}
/**
* @author cuishifeng
* @create 2018-08-02
**/
public class OfficeMouse extends Mouse {
@Override
public void productMouse() {
System.out.println("办公鼠标");
}
}
абстрактная фабрика
/**
* @author cuishifeng
* @create 2018-08-02
**/
public interface IFactory {
/**
* 获取计算机
* @return
*/
Computer getComputer();
/**
* 获取鼠标
* @return
*/
Mouse getMouse();
}
/**
* @author cuishifeng
* @create 2018-08-02
**/
public class ProductFactoryA implements IFactory {
@Override
public Computer getComputer() {
return new PcComputer();
}
@Override
public Mouse getMouse() {
return new OfficeMouse();
}
}
/**
* @author cuishifeng
* @create 2018-08-02
**/
public class ProductFactoryB implements IFactory {
@Override
public Computer getComputer() {
return new ServerComputer();
}
@Override
public Mouse getMouse() {
return new GameMouse();
}
}
простая фабрика
резюме
- абстрактный класс продукта
- конкретная категория продуктов
- завод
преимущество
- Просто и легко реализовать
- Дайте экземпляр класса фабрике, которую легко отделить
недостаток
1. Добавление конкретных продуктов требует изменения фабрики, что нарушает принцип открытия и закрытия OCP.
Дальнейшая интерпретация точки зрения кода
абстрактный класс продукта
/**
* @author cuishifeng
* @create 2018-07-09
**/
public interface Car {
/**
* 我有一辆什么车
*/
void myCar();
}
конкретный продукт
/**
* @author cuishifeng
* @create 2018-07-09
**/
public class BenChiCar implements Car {
@Override
public void myCar() {
System.out.println("我有一辆奔驰车!");
}
}
public class FerrariCar implements Car {
@Override
public void myCar() {
System.out.println("我有一辆法拉利!");
}
}
public class LamborghiniCar implements Car {
@Override
public void myCar() {
System.out.println("我有一辆兰博基尼!");
}
}
Заводской класс
public class CarFactory {
public static Car createCar(String carName){
if (carName == null){
return null;
}
switch (carName){
case "BenChiCar":
return new BenChiCar();
case "FerrariCar":
return new FerrariCar();
case "LamborghiniCar":
return new LamborghiniCar();
default:
return null;
}
}
}
Car car = CarFactory.createCar("BenChiCar");
car.myCar();
Car car2 = CarFactory.createCar("FerrariCar");
car2.myCar();
输出
我有一辆奔驰车!
我有一辆法拉利!
Суммировать
Самым большим преимуществом простого фабричного шаблона является то, что на фабрике есть определенная логика для определения того, какой продукт генерировать, и экземпляр класса передается на фабрику, так что, когда нам нужен какой-либо продукт, нам нужно только изменить вызов клиента без модификации завода.С одной стороны, это снижает зависимость от конкретных продуктов
Шаблон фабричного метода является расширением простой фабрики. Шаблон фабричного метода передает логическое суждение класса, реализующего исходную простую фабрику, клиенту. Если вы хотите добавить функции, вам нужно только изменить клиент и добавить определенные функции, не изменяя предыдущий класс.
Шаблон абстрактной фабрики расширяет шаблон фабричного метода. Он устраняет недостатки исходного шаблона фабричного метода, заключающиеся в том, что может быть только один абстрактный продукт и нельзя добавлять семейства продуктов. Шаблон абстрактной фабрики не только следует принципу OCP (открыт для расширения, закрыта для модификации).), и вы можете добавить больше продуктов (абстрактные продукты), и конкретная фабрика может генерировать не только один продукт, но и группу продуктов.Абстрактная фабрика также объявляет группу продуктов, что более гибко для расширения, но если расширить семейство, то оно будет очень громоздким.