Teknologian jakaminen

Design Pattern Factory Pattern

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Factory Pattern on suunnittelumalli, jota käytetään yleisesti olio-ohjelmoinnissaluova malli eräänlainen.Tehdasmallia käytetään pääasiassa objektien luomiseen, mutta se eroaa sen käyttämisestä suoraan koodissa.new Avainsanojen luonti eroaa siinä, että se luo objekteja yhteisen käyttöliittymän kautta, mikä erottaa objektin luontiprosessin asiakaskoodin käytöstä. Seuraavassa on yksityiskohtainen esittely tehdasmalliin:

1. Tehdasmallin pääominaisuudet

  1. Kapseloitujen objektien luontiprosessi: Kapseloi objektin luontiprosessi tehdasluokkaan Asiakkaan tarvitsee vain määrittää luotavan objektin tyyppi, ja sitten se voi hankkia tarvittavan objektin tehdasluokan kautta välittämättä objektin luomisen yksityiskohdista.
  2. Vähennä kytkentää: Eristämällä abstrakti tehdas ja betonitehdas, asiakkaan ja kohteen välinen kytkentä vähenee, jolloin asiakasohjelmaa on helpompi laajentaa ja ylläpitää.
  3. Paranna ohjelman skaalautuvuutta: Kun haluat lisätä uuden tuotteen, sinun on lisättävä vain vastaava tuoteluokka ja vastaava tehdasluokka. Alkuperäistä koodia ei tarvitse muokata muokkausta varten), mikä parantaa koodin skaalautuvuutta.
  4. Helppo huoltaa ja päivittää: Koska tehdasmenetelmä keskittää objektien luontiprosessin yhteen luokkaan, jos objektien luontitapaa on muutettava, tarvitsee vain muokata vastaavaa tehdasluokkaa, eikä sillä ole vaikutusta asiakkaaseen.
  5. koodin uudelleenkäyttö: Tehdasmalli voi abstraktoida objektin luontiprosessin, toteuttaa koodin uudelleenkäytön ja lisätä koodin joustavuutta ja uudelleenkäytettävyyttä.

2. Tehdasmallin luokitus

Tehdaskuviot jaetaan pääasiassa kolmeen tyyppiin: yksinkertainen tehdaskuvio (staattinen tehdaskuvio), tehdasmenetelmäkuvio ja abstrakti tehdaskuvio.

1. Staattinen tehdasmenetelmä
  1. Määrittele tehdasluokka palauttaaksesi eri luokkien esiintymät eri parametrien perusteella.
  2. Tehdasluokat sisältävät yleensä useita staattisia menetelmiä, joista jokainen vastaa tietyn tuotteen luomista.
  3. Edut: Yksinkertainen toteuttaa ja helppo ymmärtää.
  4. Miinukset: Tehdasluokan vastuut ovat liian raskaat Uusia tuotteita lisättäessä tehdasluokan lähdekoodia on muutettava, mikä rikkoo avaus- ja sulkemisperiaatetta.

Yksinkertainen tehdaskuvioluokkakaavio

2. Tehdasmenetelmä (tehdasmenetelmä)
  1. Määritä käyttöliittymä (abstrakti tehdas) objektien luomista varten,Mutta anna alaluokan päättää, mikä luokka instantoi
  2. Tehdasmenetelmät mahdollistavat luokan ilmentymisen lykkäämisen alaluokkiin.
  3. Edut: Hyvä skaalautuvuus Kun uusia tuotteita on lisättävä, on lisättävä vain vastaavat tietyt tuotekategoriat ja tietyt tehdaskategoriat.
  4. Haitat: Joka kerta kun tuote lisätään, on lisättävä tietty luokka- ja objektitoteutustehdas, mikä kaksinkertaistaa järjestelmän luokkien määrän ja lisää järjestelmän monimutkaisuutta.

Tehdasmenetelmän malli

3. Abstract Factory -kuvio (Abstract Factory)
  1. Tarjoaa käyttöliittymän toisiinsa liittyvien tai toisistaan ​​riippuvaisten objektien sarjan luomiseen määrittelemättä niiden konkreettisia luokkia.
  2. Abstrakti tehdaskuvio voidaan nähdä useiden tehdasmenetelmäkuvioiden yhteiskäytönä.
  3. Edut: Tuoteperhe voidaan rajoittaa luokan sisällä Tietyn tehtaan on kyettävä valmistamaan kaikki tuoteperheen tuotteet.
  4. Haitat: Se lisää abstraktiota ja järjestelmän ymmärtämisen vaikeutta, ja luokkien määrä järjestelmässä kasvaa merkittävästi.

abstrakti tehdaskuvio

3. Tehdasmallin sovellusskenaariot

Tehdasmallilla on laaja valikoima varsinaisia ​​sovelluksia, kuten tietokantayhteydet, käyttöliittymäohjaukset, tiedostojen käsittely, kirjaus, verkkoliikenne, viestijonot, tietorakenteet, salaus ja salauksen purku, viestien työntö ja tehtävien ajoitus. Näissä skenaarioissa tehdasmallin käyttö voi erottaa objektin luontiprosessin käyttöprosessista, mikä parantaa järjestelmän joustavuutta ja skaalautuvuutta.

4. Tehdasmalliesimerkki

1. Yksinkertainen tehdaskuvioesimerkki

Yksinkertaisessa tehdasmallissa määritämme tehdasluokan, joka voi palauttaa eri tyyppisiä esiintymiä annettujen parametrien perusteella.

Alla on esimerkki yksinkertaisesta Java-kielellä kirjoitetusta tehdaskuviosta. Luomme muototehtaan, joka voi tuottaa ympyröitä, suorakulmioita ja neliöitä. Ensin määritellään muotorajapinta (Shape) ja useita konkreettisia luokkia (Ympyrä, Suorakulmio, Neliö), jotka toteuttavat tämän rajapinnan.

  1. // 形状接口
  2. interface Shape {
  3. void draw();
  4. }
  5. // 圆形类
  6. class Circle implements Shape {
  7. @Override
  8. public void draw() {
  9. System.out.println("Inside Circle::draw() method.");
  10. }
  11. }
  12. // 矩形类
  13. class Rectangle implements Shape {
  14. @Override
  15. public void draw() {
  16. System.out.println("Inside Rectangle::draw() method.");
  17. }
  18. }
  19. // 正方形类
  20. class Square implements Shape {
  21. @Override
  22. public void draw() {
  23. System.out.println("Inside Square::draw() method.");
  24. }
  25. }

Seuraavaksi määrittelemme tehdasluokan (ShapeFactory), joka käyttää staattisia menetelmiä muotoobjektien luomiseen.

  1. // 形状工厂类
  2. class ShapeFactory {
  3. // 使用 getShape 方法获取形状类型的对象
  4. public static Shape getShape(String shapeType){
  5. if(shapeType == null){
  6. return null;
  7. }
  8. if(shapeType.equalsIgnoreCase("CIRCLE")){
  9. return new Circle();
  10. } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
  11. return new Rectangle();
  12. } else if(shapeType.equalsIgnoreCase("SQUARE")){
  13. return new Square();
  14. }
  15. return null;
  16. }
  17. }

Lopuksi voimme käyttää tehdasluokkaa muotoobjektien saamiseksi ja kutsua niitädrawmenetelmä.

  1. public class FactoryPatternDemo {
  2. public static void main(String[] args) {
  3. // 获取 Circle 的对象,并调用它的 draw 方法
  4. Shape shape1 = ShapeFactory.getShape("CIRCLE");
  5. shape1.draw();
  6. // 获取 Rectangle 的对象,并调用它的 draw 方法
  7. Shape shape2 = ShapeFactory.getShape("RECTANGLE");
  8. shape2.draw();
  9. // 获取 Square 的对象,并调用它的 draw 方法
  10. Shape shape3 = ShapeFactory.getShape("SQUARE");
  11. shape3.draw();
  12. }
  13. }

Tässä esimerkissäShapeFactoryluokka vastaa luomisestaShape Esimerkki käyttöliittymästä.Asiakaskoodi tekee tämän välittämällä tyyppitiedot (esim. merkkijono) käyttäjälleShapeFactorystaattinen luokkamenetelmägetShape saadaksesi halutun muodon esiintymän. Tällä tavalla asiakas irrotetaan tietyn luokan toteutuksesta ja noudattaa avaus- ja sulkemisperiaatetta, eli uusia muotoluokkia voidaan laajentaa asiakaskoodia muuttamatta. Yksinkertaisen tehdaskuvion suuri haitta on kuitenkin se, että jos järjestelmää on laajennettava uusilla tuoteperheillä (kuten väreillä muotojen lisäksi jne.), tehdasluokkaa on muutettava, mikä rikkoo osaa avoimesta. -suljettu periaate. Harkitse tässä tapauksessa Factory Method - tai Abstract Factory -kuvion käyttöä.

2. Tehdasmenetelmän malliesimerkki

Edelleen muotoaan esimerkkinä, käytämme suunnittelumenetelmiä sen luomiseen.

Määritä ensin muodon käyttöliittymä (Tuote) ja luo kolme toteutusluokkaa.

  1. // 形状接口
  2. interface Shape {
  3. void draw();
  4. }
  5. // 圆形类
  6. class Circle implements Shape {
  7. @Override
  8. public void draw() {
  9. System.out.println("Inside Circle::draw() method.");
  10. }
  11. }
  12. // 矩形类
  13. class Rectangle implements Shape {
  14. @Override
  15. public void draw() {
  16. System.out.println("Inside Rectangle::draw() method.");
  17. }
  18. }
  19. // 正方形类
  20. class Square implements Shape {
  21. @Override
  22. public void draw() {
  23. System.out.println("Inside Square::draw() method.");
  24. }
  25. }

Määritä seuraavaksi luojan käyttöliittymä (Creator) ja konkreettinen luoja (Concrete Creator):

  1. // 创建者接口
  2. interface ShapeFactory {
  3. Shape getShape(String shapeType);
  4. }
  5. // 具体创建者类
  6. class RectangleFactory implements ShapeFactory {
  7. @Override
  8. public Shape getShape(String shapeType) {
  9. if (shapeType == null) {
  10. return null;
  11. }
  12. if (shapeType.equalsIgnoreCase("RECTANGLE")) {
  13. return new Rectangle();
  14. }
  15. return null;
  16. }
  17. }
  18. class CircleFactory implements ShapeFactory {
  19. @Override
  20. public Shape getShape(String shapeType) {
  21. if (shapeType == null) {
  22. return null;
  23. }
  24. if (shapeType.equalsIgnoreCase("CIRCLE")) {
  25. return new Circle();
  26. }
  27. return null;
  28. }
  29. }
  30. class SquareFactory implements ShapeFactory {
  31. @Override
  32. public Shape getShape(String shapeType) {
  33. if (shapeType == null) {
  34. return null;
  35. }
  36. if (shapeType.equalsIgnoreCase("SQUARE")) {
  37. return new Square();
  38. }
  39. return null;
  40. }
  41. }

Käytä lopuksi konkreettista luojaluokkaa saadaksesi muotoobjektit ja kutsua niitädrawmenetelmä:

  1. public class FactoryMethodPatternDemo {
  2. public static void main(String[] args) {
  3. ShapeFactory shapeFactory = new CircleFactory();
  4. // 获取 Circle 的对象,并调用它的 draw 方法
  5. Shape shape1 = shapeFactory.getShape("CIRCLE");
  6. shape1.draw();
  7. // 使用 RectangleFactory 来获取 Rectangle 的对象
  8. shapeFactory = new RectangleFactory();
  9. Shape shape2 = shapeFactory.getShape("RECTANGLE");
  10. shape2.draw();
  11. // 使用 SquareFactory 来获取 Square 的对象
  12. shapeFactory = new SquareFactory();
  13. Shape shape3 = shapeFactory.getShape("SQUARE");
  14. shape3.draw();
  15. }
  16. }

Tässä esimerkissäLuomme kullekin muotoluokalle vastaavan tehdasluokan (Vaikka todellisissa sovelluksissa on yleensä yleisempi tehdasluokkarakenne, ehkä määritystiedostojen tai pohdinnan kautta, jotta vältytään kirjoittamasta erillisiä tehdasluokkia kullekin tuoteluokalle). Tämä auttaa esittelemään Factory Method -mallin perusperiaatteet,Eli anna tehtaan alaluokan päättää, mikä luokka instantoidaan . Tämän esimerkin yksinkertaisessa tapauksessa saatat kuitenkin olla taipuvaisempia käyttämään Simple Factory -mallia tai harkitsemaan muita suunnittelumalleja koodin päällekkäisyyden vähentämiseksi.

3. Abstrakti tehdasesimerkki

Tässä esimerkissä otetaan esimerkkinä matkapuhelimet, matkapuhelimiin liittyvät abstraktit tuotteet (kuten näytöt, akut, käyttöjärjestelmät jne.) ja luodaan erityisiä tuoteluokkia näiden rajapintojen toteuttamiseksi. Voimme sitten määritellä abstrakteja tehdasrajapintoja ja konkreettisia tehdasluokkia näiden tuotteiden valmistamiseksi. Tässä on yksinkertaistettu esimerkki siitä, kuinka Abstract Factory -kuviota käytetään osien (näytöt ja akut) tuottamiseen eri matkapuhelinmerkeille ja -malleille:

Määritä ensin tuotteen käyttöliittymä ja tietyt tuotteet:

  1. // 屏幕接口
  2. interface Screen {
  3. void display();
  4. }
  5. // 高端屏幕的实现
  6. class HighEndScreen implements Screen {
  7. @Override
  8. public void display() {
  9. System.out.println("显示高清屏幕");
  10. }
  11. }
  12. // 低端屏幕的实现
  13. class LowEndScreen implements Screen {
  14. @Override
  15. public void display() {
  16. System.out.println("显示普通屏幕");
  17. }
  18. }
  19. // 电池接口
  20. interface Battery {
  21. void charge();
  22. }
  23. // 高效电池的实现
  24. class HighEfficiencyBattery implements Battery {
  25. @Override
  26. public void charge() {
  27. System.out.println("快速充电");
  28. }
  29. }
  30. // 标准电池的实现
  31. class StandardBattery implements Battery {
  32. @Override
  33. public void charge() {
  34. System.out.println("标准充电");
  35. }
  36. }

Määritä seuraavaksi abstrakti tehdasliittymä ja betonitehdasluokka:

  1. // 手机组件工厂接口
  2. interface PhoneFactory {
  3. Screen createScreen();
  4. Battery createBattery();
  5. }
  6. // 高端手机工厂
  7. class HighEndPhoneFactory implements PhoneFactory {
  8. @Override
  9. public Screen createScreen() {
  10. return new HighEndScreen();
  11. }
  12. @Override
  13. public Battery createBattery() {
  14. return new HighEfficiencyBattery();
  15. }
  16. }
  17. // 低端手机工厂
  18. class LowEndPhoneFactory implements PhoneFactory {
  19. @Override
  20. public Screen createScreen() {
  21. return new LowEndScreen();
  22. }
  23. @Override
  24. public Battery createBattery() {
  25. return new StandardBattery();
  26. }
  27. }

Lopuksi asiakaskoodi, joka käyttää abstraktia tehdasta konkreettisten tuoteobjektien luomiseen:

  1. public class PhoneFactoryPatternDemo {
  2. public static void main(String[] args) {
  3. // 使用高端手机工厂
  4. PhoneFactory highEndFactory = new HighEndPhoneFactory();
  5. Screen highEndScreen = highEndFactory.createScreen();
  6. Battery highEndBattery = highEndFactory.createBattery();
  7. highEndScreen.display();
  8. highEndBattery.charge();
  9. // 使用低端手机工厂
  10. PhoneFactory lowEndFactory = new LowEndPhoneFactory();
  11. Screen lowEndScreen = lowEndFactory.createScreen();
  12. Battery lowEndBattery = lowEndFactory.createBattery();
  13. lowEndScreen.display();
  14. lowEndBattery.charge();
  15. }
  16. }

Tässä esimerkissä määrittelemme kaksi matkapuhelintehdasta (high-end ja lowend), jotka kumpikin pystyvät tuottamaan tietyntyyppisen näytön ja akun.Asiakaskoodi on vuorovaikutuksessa tietyn tehdasluokan kanssa abstraktin tehdasrajapinnan kautta, mikä saavuttaa irrotuksen tietystä tuoteluokasta. . Tällä tavalla, jos meidän on tulevaisuudessa lisättävä uusia puhelintyyppejä (esimerkiksi keskihintaisia ​​puhelimia), meidän tarvitsee vain lisätä uusia tuoteluokkia ja vastaavia tehdasluokkia ilman, että muutamme olemassa olevaa asiakaskoodia.

5. Yhteenveto

Tehdaskuvio on erittäin hyödyllinen suunnittelukuvio,Se kapseloi objektien luontiprosessin, vähentää kytkentää, parantaa ohjelman skaalautuvuutta ja ylläpidon helppoutta jne. , on käytetty laajasti ohjelmistokehityksessä.Siinä on kuitenkin myös joitainHaitat, kuten liialliset tehdasvastuut, vaikeudet järjestelmän laajentamisessa jne. . Siksi käytännön sovelluksissa kompromisseja ja valintoja on tehtävä erityisten skenaarioiden ja tarpeiden perusteella.

Jos tehdaskuvio (yksinkertainen tehdas, tehdasmenetelmä, abstrakti tehdas) on sinulle hyödyllinen, muista tykätä ja kerätä siitä.