моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Фабричный шаблон — это шаблон проектирования, обычно используемый в объектно-ориентированном программировании. Он принадлежит к группе.творческая модель вроде.Фабричный шаблон в основном используется для создания объектов, но отличается от его использования непосредственно в коде.new
Создание ключевых слов отличается тем, что оно создает объекты через общий интерфейс, тем самым отделяя процесс создания объекта от использования клиентского кода. Ниже приводится подробное введение в фабричный шаблон:
Фабричные шаблоны в основном делятся на три типа: простой фабричный шаблон (статический фабричный шаблон), шаблон фабричного метода и абстрактный фабричный шаблон.
Простая диаграмма классов фабричного шаблона
Шаблон фабричного метода
абстрактный фабричный узор
Фабричный шаблон имеет широкий спектр приложений, находящихся в стадии разработки, таких как соединения с базами данных, элементы управления пользовательским интерфейсом, обработка файлов, ведение журналов, сетевые коммуникации, очереди сообщений, структуры данных, шифрование и дешифрование, передача сообщений и планирование задач. В этих сценариях использование шаблона фабрики может отделить процесс создания объекта от процесса использования, повышая гибкость и масштабируемость системы.
В простом шаблоне фабрики мы определяем фабричный класс, который может возвращать экземпляры разных типов на основе переданных параметров.
Ниже приведен пример простого шаблона фабрики, написанного на Java. Мы создадим фабрику форм, которая сможет создавать экземпляры кругов, прямоугольников и квадратов. Сначала мы определяем интерфейс формы (Shape) и несколько конкретных классов (Circle, Rectangle, Square), реализующих этот интерфейс.
- // 形状接口
- interface Shape {
- void draw();
- }
-
- // 圆形类
- class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Circle::draw() method.");
- }
- }
-
- // 矩形类
- class Rectangle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Rectangle::draw() method.");
- }
- }
-
- // 正方形类
- class Square implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Square::draw() method.");
- }
- }
Далее мы определяем фабричный класс (ShapeFactory), который использует статические методы для создания объектов формы.
- // 形状工厂类
- class ShapeFactory {
-
- // 使用 getShape 方法获取形状类型的对象
- public static Shape getShape(String shapeType){
- if(shapeType == null){
- return null;
- }
- if(shapeType.equalsIgnoreCase("CIRCLE")){
- return new Circle();
- } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
- return new Rectangle();
- } else if(shapeType.equalsIgnoreCase("SQUARE")){
- return new Square();
- }
-
- return null;
- }
- }
Наконец, мы можем использовать фабричный класс, чтобы получать объекты формы и вызывать их.draw
метод.
- public class FactoryPatternDemo {
-
- public static void main(String[] args) {
- // 获取 Circle 的对象,并调用它的 draw 方法
- Shape shape1 = ShapeFactory.getShape("CIRCLE");
- shape1.draw();
-
- // 获取 Rectangle 的对象,并调用它的 draw 方法
- Shape shape2 = ShapeFactory.getShape("RECTANGLE");
- shape2.draw();
-
- // 获取 Square 的对象,并调用它的 draw 方法
- Shape shape3 = ShapeFactory.getShape("SQUARE");
- shape3.draw();
- }
- }
В этом примереShapeFactory
класс отвечает за созданиеShape
Экземпляр интерфейса.Клиентский код делает это, передавая информацию о типе (например, строку) вShapeFactory
статический метод классаgetShape
чтобы получить экземпляр нужной формы. Таким образом, клиент отделен от реализации конкретного класса и соответствует принципу открытия и закрытия, то есть новые классы фигур могут расширяться без изменения клиентского кода. Однако основным недостатком простого шаблона фабрики является то, что если систему необходимо расширить новыми семействами продуктов (например, цветами в дополнение к формам и т. д.), класс фабрики необходимо изменить, что нарушает часть открытых правил. -закрытый принцип. В этом случае рассмотрите возможность использования шаблона «Фабричный метод» или шаблона «Абстрактная фабрика».
Продолжая брать форму в качестве примера, мы используем инженерные методы для ее создания.
Сначала определите интерфейс формы (Продукт) и создайте три класса реализации.
- // 形状接口
- interface Shape {
- void draw();
- }
-
- // 圆形类
- class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Circle::draw() method.");
- }
- }
-
- // 矩形类
- class Rectangle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Rectangle::draw() method.");
- }
- }
-
- // 正方形类
- class Square implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Square::draw() method.");
- }
- }
Затем определите интерфейс создателя (Creator) и создателя бетона (Concrete Creator):
- // 创建者接口
- interface ShapeFactory {
- Shape getShape(String shapeType);
- }
-
- // 具体创建者类
- class RectangleFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("RECTANGLE")) {
- return new Rectangle();
- }
- return null;
- }
- }
-
- class CircleFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("CIRCLE")) {
- return new Circle();
- }
- return null;
- }
- }
-
- class SquareFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("SQUARE")) {
- return new Square();
- }
- return null;
- }
- }
Наконец, используйте класс создателя бетона, чтобы получить объекты формы и вызвать их.draw
метод:
- public class FactoryMethodPatternDemo {
-
- public static void main(String[] args) {
- ShapeFactory shapeFactory = new CircleFactory();
-
- // 获取 Circle 的对象,并调用它的 draw 方法
- Shape shape1 = shapeFactory.getShape("CIRCLE");
- shape1.draw();
-
- // 使用 RectangleFactory 来获取 Rectangle 的对象
- shapeFactory = new RectangleFactory();
- Shape shape2 = shapeFactory.getShape("RECTANGLE");
- shape2.draw();
-
- // 使用 SquareFactory 来获取 Square 的对象
- shapeFactory = new SquareFactory();
- Shape shape3 = shapeFactory.getShape("SQUARE");
- shape3.draw();
- }
- }
В этом примереМы создаем соответствующий фабричный класс для каждого класса формы. (Хотя в реальных приложениях обычно используется более общая структура фабричных классов, возможно, посредством файлов конфигурации или отражения, чтобы избежать написания отдельных фабричных классов для каждого класса продукта). Это помогает продемонстрировать основные принципы шаблона Factory Method.То есть пусть подкласс фабрики решает, какой класс создать. . Однако для простого случая в этом примере вы можете быть более склонны использовать шаблон Simple Factory или рассмотреть другие шаблоны проектирования, чтобы уменьшить дублирование кода.
В этом примере в качестве примера используются мобильные телефоны, абстрактные продукты, связанные с мобильными телефонами (такие как экраны, аккумуляторы, операционные системы и т. д.), и создаются конкретные классы продуктов для реализации этих интерфейсов. Затем мы можем определить абстрактные фабричные интерфейсы и конкретные фабричные классы для производства этих продуктов. Вот упрощенный пример, показывающий, как использовать шаблон «Абстрактная фабрика» для производства компонентов (экранов и аккумуляторов) для разных марок и моделей мобильных телефонов:
Сначала определите интерфейс продукта и конкретные продукты:
- // 屏幕接口
- interface Screen {
- void display();
- }
-
-
- // 高端屏幕的实现
- class HighEndScreen implements Screen {
- @Override
- public void display() {
- System.out.println("显示高清屏幕");
- }
- }
-
- // 低端屏幕的实现
- class LowEndScreen implements Screen {
- @Override
- public void display() {
- System.out.println("显示普通屏幕");
- }
- }
-
-
- // 电池接口
- interface Battery {
- void charge();
- }
-
-
- // 高效电池的实现
- class HighEfficiencyBattery implements Battery {
- @Override
- public void charge() {
- System.out.println("快速充电");
- }
- }
-
- // 标准电池的实现
- class StandardBattery implements Battery {
- @Override
- public void charge() {
- System.out.println("标准充电");
- }
- }
Затем определите абстрактный интерфейс фабрики и конкретный класс фабрики:
- // 手机组件工厂接口
- interface PhoneFactory {
- Screen createScreen();
- Battery createBattery();
- }
-
- // 高端手机工厂
- class HighEndPhoneFactory implements PhoneFactory {
- @Override
- public Screen createScreen() {
- return new HighEndScreen();
- }
-
- @Override
- public Battery createBattery() {
- return new HighEfficiencyBattery();
- }
- }
-
- // 低端手机工厂
- class LowEndPhoneFactory implements PhoneFactory {
- @Override
- public Screen createScreen() {
- return new LowEndScreen();
- }
-
- @Override
- public Battery createBattery() {
- return new StandardBattery();
- }
- }
Наконец, клиентский код, который использует абстрактную фабрику для создания конкретных объектов продукта:
- public class PhoneFactoryPatternDemo {
- public static void main(String[] args) {
- // 使用高端手机工厂
- PhoneFactory highEndFactory = new HighEndPhoneFactory();
- Screen highEndScreen = highEndFactory.createScreen();
- Battery highEndBattery = highEndFactory.createBattery();
-
- highEndScreen.display();
- highEndBattery.charge();
-
- // 使用低端手机工厂
- PhoneFactory lowEndFactory = new LowEndPhoneFactory();
- Screen lowEndScreen = lowEndFactory.createScreen();
- Battery lowEndBattery = lowEndFactory.createBattery();
-
- lowEndScreen.display();
- lowEndBattery.charge();
- }
- }
В этом примере мы определяем два завода по производству мобильных телефонов (высокого и низкого уровня), каждый из которых способен производить определенный тип экрана и батареи.Клиентский код взаимодействует с конкретным классом фабрики через интерфейс абстрактной фабрики, тем самым обеспечивая отделение от конкретного класса продукта. . Таким образом, если нам понадобится добавить новые типы телефонов в будущем (например, телефоны среднего класса), нам нужно будет только добавить новые классы продуктов и соответствующие заводские классы без изменения существующего клиентского кода.
Фабричный шаблон — очень полезный шаблон проектирования.Он инкапсулирует процесс создания объектов, уменьшает связанность, улучшает масштабируемость программы и простоту обслуживания и т. д. , широко используется при разработке программного обеспечения.Однако он также имеет некоторыеНедостатки, такие как чрезмерная заводская ответственность, сложность расширения системы и т. д. . Поэтому в практических приложениях необходимо принимать компромиссные решения и делать выбор на основе конкретных сценариев и потребностей.
Если вам пригодится фабричный паттерн (простая фабрика, фабричный метод, абстрактная фабрика), не забудьте поставить лайк и собрать его.