le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Factory Pattern è un modello di progettazione comunemente utilizzato nella programmazione orientata agli oggetti a cui appartienemodello creazionale tipo.Il pattern factory viene utilizzato principalmente per creare oggetti, ma è diverso dall'utilizzarlo direttamente nel codice.new
La creazione di parole chiave è diversa in quanto crea oggetti tramite un'interfaccia comune, separando così il processo di creazione dell'oggetto dall'utilizzo del codice client. Quella che segue è un'introduzione dettagliata al modello di fabbrica:
I modelli di fabbrica sono principalmente divisi in tre tipi: modello di fabbrica semplice (modello di fabbrica statico), modello di metodo di fabbrica e modello di fabbrica astratto.
Diagramma delle classi del modello di fabbrica semplice
Modello del metodo di fabbrica
modello astratto di fabbrica
Il modello factory ha un'ampia gamma di applicazioni in fase di sviluppo effettivo, come connessioni di database, controlli dell'interfaccia utente, elaborazione di file, registrazione, comunicazioni di rete, code di messaggi, strutture di dati, crittografia e decrittografia, push di messaggi e pianificazione delle attività. In questi scenari, l'utilizzo del modello factory può separare il processo di creazione dell'oggetto dal processo di utilizzo, migliorando la flessibilità e la scalabilità del sistema.
Nel modello factory semplice, definiamo una classe factory che può restituire istanze di tipi diversi in base ai parametri passati.
Di seguito è riportato un esempio di un semplice modello di fabbrica scritto in Java. Creeremo una fabbrica di forme in grado di produrre istanze di cerchi, rettangoli e quadrati. Per prima cosa definiamo un'interfaccia di forma (Shape) e diverse classi concrete (Circle, Rectangle, Square) che implementano questa interfaccia.
- // 形状接口
- 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.");
- }
- }
Successivamente, definiamo una classe factory (ShapeFactory) che utilizza metodi statici per generare oggetti forma.
- // 形状工厂类
- 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;
- }
- }
Infine, possiamo utilizzare una classe factory per ottenere oggetti forma e chiamarlidraw
metodo.
- 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();
- }
- }
In questo esempio,ShapeFactory
la classe è responsabile della creazioneShape
Un'istanza dell'interfaccia.Il codice client esegue questa operazione passando informazioni sul tipo (ad esempio stringa) aShapeFactory
metodo statico di classegetShape
per ottenere un'istanza della forma desiderata. In questo modo il client è disaccoppiato dall'implementazione della classe specifica e rispetta il principio di apertura e chiusura, ovvero è possibile estendere nuove classi di forme senza modificare il codice client. Tuttavia, uno dei principali svantaggi del modello di fabbrica semplice è che se il sistema deve essere esteso con nuove famiglie di prodotti (come colori oltre a forme, ecc.), la classe di fabbrica deve essere modificata, il che viola parte del modello aperto -principio chiuso. In questo caso, considera l'utilizzo del modello Factory Method o del modello Abstract Factory.
Prendendo ancora forma come esempio, utilizziamo metodi ingegneristici per crearlo.
Per prima cosa definisci l'interfaccia della forma (Prodotto) e crea tre classi di implementazione.
- // 形状接口
- 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.");
- }
- }
Successivamente, definisci l'interfaccia del creatore (Creator) e il creatore concreto (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;
- }
- }
Infine, usa la classe concrete creator per ottenere gli oggetti forma e chiamarlidraw
metodo:
- 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();
- }
- }
In questo esempio,Creiamo una classe factory corrispondente per ogni classe di forma (Sebbene nelle applicazioni reali, di solito ci sarà una struttura di classi factory più generale, magari attraverso file di configurazione o riflessione per evitare di scrivere classi factory separate per ciascuna classe di prodotto). Questo aiuta a dimostrare i principi di base del modello Factory Method,Cioè, lascia che sia la sottoclasse factory a decidere quale classe istanziare . Tuttavia, per il caso semplice di questo esempio, potresti essere più propenso a utilizzare il modello Simple Factory o a prendere in considerazione altri modelli di progettazione per ridurre la duplicazione del codice.
Questo esempio prende come esempio i telefoni cellulari, prodotti astratti relativi ai telefoni cellulari (come schermi, batterie, sistemi operativi, ecc.) e crea classi di prodotti specifiche per implementare queste interfacce. Possiamo quindi definire interfacce di fabbrica astratte e classi di fabbrica concrete per produrre questi prodotti. Ecco un esempio semplificato che mostra come utilizzare il modello Abstract Factory per produrre componenti (schermi e batterie) per diverse marche e modelli di telefoni cellulari:
Innanzitutto, definisci l'interfaccia del prodotto e i prodotti specifici:
- // 屏幕接口
- 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("标准充电");
- }
- }
Successivamente, definisci l'interfaccia della fabbrica astratta e la classe della fabbrica concreta:
- // 手机组件工厂接口
- 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();
- }
- }
Infine, il codice cliente, che utilizza una fabbrica astratta per creare oggetti di prodotto concreti:
- 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();
- }
- }
In questo esempio definiamo due fabbriche di telefoni cellulari (di fascia alta e di fascia bassa), ciascuna in grado di produrre uno specifico tipo di schermo e batteria.Il codice client interagisce con la classe di fabbrica specifica attraverso l'interfaccia della fabbrica astratta, ottenendo così il disaccoppiamento dalla classe di prodotto specifica. . In questo modo, se in futuro avremo bisogno di aggiungere nuovi tipi di telefoni (ad esempio telefoni di fascia media), basterà aggiungere nuove classi di prodotto e corrispondenti classi di fabbrica senza modificare il codice cliente esistente.
Il modello di fabbrica è un modello di progettazione molto utile,Incapsula il processo di creazione degli oggetti, riduce l'accoppiamento, migliora la scalabilità del programma e la facilità di manutenzione, ecc. , è stato ampiamente utilizzato nello sviluppo di software.Tuttavia ne ha anche alcuniSvantaggi, come eccessive responsabilità di fabbrica, difficoltà nell’espansione del sistema, ecc. . Pertanto, nelle applicazioni pratiche, è necessario fare compromessi e scelte in base a scenari ed esigenze specifici.
Se il pattern factory (fabbrica semplice, metodo factory, fabbrica astratta) ti è utile, ricordati di mettere mi piace e collezionarlo.