Rumah > hujung hadapan web > tutorial js > Menguasai Corak Kilang Abstrak: Panduan Komprehensif

Menguasai Corak Kilang Abstrak: Panduan Komprehensif

Susan Sarandon
Lepaskan: 2024-12-05 20:41:14
asal
906 orang telah melayarinya

Pernahkah anda mendapati diri anda perlu membuat pelbagai variasi keluarga objek yang berbeza dalam aplikasi anda tanpa menduplikasi logik berulang kali?

Atau mungkin anda telah membina aplikasi, hanya untuk menyedari bahawa keperluan baharu atau perubahan keutamaan pelanggan menuntut objek baharu sepenuhnya, memaksa anda mengolah semula keseluruhan pangkalan kod anda?

Bagaimana jika ada cara untuk lancar memperkenalkan variasi baharu tanpa melanggar kod sedia ada anda hanya dengan memasukkan perlaksanaan baharu?

Di situlah corak reka bentuk Kilang Abstrak masuk!

Dalam tutorial ini, kami akan memecahkan corak reka bentuk yang berkuasa ini dengan membina aplikasi Node.js CLI untuk mencipta pelbagai jenis resume yang menyokong berbilang format dan tema.

Gambaran keseluruhan

Kilang Abstrak ialah corak reka bentuk ciptaan , iaitu kategori corak reka bentuk yang menangani masalah berbeza yang datang dengan cara asli mencipta objek menggunakan kata kunci atau pengendali baharu.

Anda boleh menganggap corak reka bentuk Kilang Abstrak sebagai generalisasi corak reka bentuk kaedah kilang yang telah kami bincangkan dalam artikel blog ini.

Masalah

Corak reka bentuk Kilang Abstrak menyelesaikan masalah berikut:

  1. Bagaimanakah kita boleh mencipta keluarga produk berkaitan seperti: PDFResume , JSONResume dan MarkdownResume?
  2. Bagaimanakah kita boleh menyokong mempunyai berbilang varian bagi setiap keluarga produk seperti: CreativeResume , MinimalistResume dan ModernResume?
  3. Bagaimanakah kami boleh menyokong penambahan lebih banyak varian dan produk tanpa melanggar kod pengguna atau pelanggan kami yang sedia ada?

Penyelesaian

Corak reka bentuk Kilang Abstrak menyelesaikan masalah ini dengan mengisytiharkan antara muka atau kelas abstrak untuk setiap jenis produk.

export abstract class PDFResume {}
export abstract class JSONResume {}
export abstract class MarkdownResume {}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dan kemudian, seperti yang ditunjukkan oleh nama corak, kami mencipta kilang abstrak yang merupakan antara muka yang mengisytiharkan kaedah kilang yang mencipta setiap jenis produk:

  • createPDFResume : yang mengembalikan jenis atau subjenis PDFResume.
  • createMarkdownResume : yang mengembalikan jenis atau subjenis MarkdownResume.
  • createJSONResume : yang mengembalikan jenis atau subjenis JSONResume.
export interface ResumeFactory {
  createPDFResume(): PDFResume
  createMarkdownResume(): MarkdownResume
  createJSONResume(): JSONResume
}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Baiklah, kini kami mempunyai kilang generik yang mengembalikan setiap jenis produk yang mungkin, tetapi bagaimana kami boleh menyokong berbilang varian bagi setiap produk?

Jawapannya ialah dengan mewujudkan ConcreteFactory yang melaksanakan kilang abstrak ( ResumeFactory ).

export abstract class PDFResume {}
export abstract class JSONResume {}
export abstract class MarkdownResume {}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kini, untuk menggunakan kilang kami dalam kelas pelanggan kami, kami hanya perlu mengisytiharkan pembolehubah jenis ResumeFactory dan kemudian membuat instantiate Kilang konkrit yang sepadan bergantung pada input pengguna.

Kod pelanggan:

export interface ResumeFactory {
  createPDFResume(): PDFResume
  createMarkdownResume(): MarkdownResume
  createJSONResume(): JSONResume
}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Struktur

Mastering the Abstract Factory Pattern: A Comprehensive Guide

Struktur corak reka bentuk Kilang Abstrak terdiri daripada kelas berikut:

  1. Kilang : Sebab untuk menamakan corak reka bentuk ini kilang abstrak ialah kelas ini mewakili kontrak antara semua ConcreteFactories. Ia mentakrifkan semua kaedah kilang.
  • Bilangan kaedah kilang adalah sama dengan bilangan produk.
  • Setiap kaedah kilang hendaklah mengembalikan jenis produk abstrak atau generik ( Produk IP{j} ).

Dalam kes kami, kaedah kilang yang diisytiharkan dalam Kilang ialah: createProductA dan createProductB

  1. ConcreteFactory{i} : Kelas ini melaksanakan kelas Factory dan menyediakan pelaksanaan tersuai untuk setiap kaedah kilang.
  • Dalam skema di atas, i adalah sama dengan 1 atau 2.
  • Bilangan ConcreteFactories adalah sama dengan bilangan varian yang mungkin bagi setiap produk.
  • Setiap konkrit kaedah kilang harus mengembalikan objek yang merupakan contoh produk yang sepadan.
  1. Produk{j} : Kelas ini sepadan dengan jenis produk abstrak.
  • Dalam skema di atas, j adalah sama dengan A atau B.
  • Setiap Produk IP{j} dilaksanakan oleh banyak kelas produk konkrit.

ConcretProductA1 dan ConcretProductA2 melaksanakan IProductA ConcretProductB1 dan ConcretProductB2 melaksanakan IProductB

  1. Produk Konkrit ialah produk yang melaksanakan salah satu daripada Produk IP{j} jenis generik.

Senario Praktikal

Dalam bahagian ini, kami akan melaksanakan contoh sebelumnya ke dalam tindakan dengan membina Aplikasi CLI Node.js TypeScript yang berfungsi sepenuhnya yang mencipta resume berdasarkan tema dan format yang dipilih oleh pengguna.

Sila lihat kod berfungsi penuh dengan mengklon repositori ini pada mesin anda.

Kemudian jalankan arahan berikut:

export abstract class PDFResume {}
export abstract class JSONResume {}
export abstract class MarkdownResume {}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Mengisytiharkan Jenis

Mari kita mulakan dengan mengisytiharkan jenis yang akan kita gunakan sepanjang tutorial untuk memastikan keselamatan jenis.

antara muka/Jenis

export interface ResumeFactory {
  createPDFResume(): PDFResume
  createMarkdownResume(): MarkdownResume
  createJSONResume(): JSONResume
}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  1. Jenis ResumeData mentakrifkan semua atribut objek resume seperti: nama, e-mel, telefon dan pelbagai pengalaman.
  2. Jenis Pengalaman terdiri daripada: syarikat, jawatan, Tarikh mula, Tarikh tamat dan perihalan.

Mengisytiharkan Kilang Abstrak Kami

Sekarang, mari kita isytiharkan jenis kilang generik, yang akan mentakrifkan tiga kaedah kilang yang sepadan dengan jenis produk yang disokong yang berbeza: PDFResume , MarkdownResume , dan JSONResume.

antara muka/ResumeFactory

export class CreativeResumeFactory implements ResumeFactory {
  createPDFResume(): CreativePDFResume {
    return new CreativePDFResume() // CreativePDFResume implements PDFResume
  }

  createMarkdownResume(): CreativeMarkdownResume {
    return new CreativeMarkdownResume() // CreativeMarkdownResume implements MarkdownResume
  }

  createJSONResume(): CreativeJSONResume {
    return new CreativeJSONResume() // CreativeJSONResume implements JSONResume
  }
}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kami akan meneliti kod mereka dalam bahagian seterusnya.

Mengisytiharkan Kelas Kongsi untuk Pelbagai Jenis Dokumen

Seterusnya, mari kita teruskan untuk mencipta kelas produk generik kami.

Setiap jenis produk akan menjadi kelas abstrak kerana kami ingin berkongsi kedua-dua atribut dan kaedah antara subjenis yang sepadan.

  1. JSONResume : Kelas mempunyai atribut data yang dilindungi, menyimpan objek jenis ResumeData dengan atribut tambahan yang dipanggil style.

Kelas mentakrifkan:

  • Kaedah pengambil untuk mengakses atribut data.
  • Kaedah hasilkan abstrak yang akan ditindih oleh subkelas kemudian.
  • Kaedah saveToFile dengan pelaksanaan asas, yang terdiri daripada menyimpan data resume dalam fail JSON.

resume/json/JSONResume

// User inputs...
let theme = "minimalist"
let format = "pdf"

let factory: ResumeFactory

switch (theme) {
  case "minimalist":
    factory = new MinimalistResumeFactory()
    break
  case "modern":
    factory = new ModernResumeFactory()
    break
  case "creative":
    factory = new CreativeResumeFactory()
    break
  default:
    throw new Error("Invalid theme.")
}

const userInput = await getUserInput()
let resume

switch (format) {
  case "pdf":
    resume = factory.createPDFResume()
    break
  case "markdown":
    resume = factory.createMarkdownResume()
    break
  case "json":
    resume = factory.createJSONResume()
    break
  default:
    throw new Error("Invalid format.")
}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Abstrak kata kunci bermaksud bahawa kelas ialah jenis generik yang tidak boleh digunakan; ia hanya boleh diwarisi oleh kelas lain.

  1. MarkdownResume : Kelas mempunyai atribut kandungan yang dilindungi, menyimpan rentetan markdown.

Kelas mentakrifkan:

  • Kaedah pengambil untuk mengakses atribut kandungan.
  • Kaedah hasilkan abstrak yang akan ditindih oleh subkelas kemudian.
  • Kaedah saveToFile yang mengambil nama fail dan kemudian menyimpan rentetan berformat turun tanda kandungan ke dalam fail.

resume/markdown/MarkdownResume

export abstract class PDFResume {}
export abstract class JSONResume {}
export abstract class MarkdownResume {}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  1. PDFResume :

Kelas ini mempunyai objek doc jenis dilindungi PDFKit.PDFDocument , yang diimport daripada pustaka bernama pdfkit. Perpustakaan memudahkan mencipta dan memanipulasi dokumen PDF melalui antara muka berorientasikan objeknya.

Kelas mentakrifkan:

  • Kaedah getter untuk mengakses atribut doc.
  • Kaedah hasilkan abstrak yang akan ditindih oleh subkelas kemudian.
  • Kaedah saveToFile yang menyimpan doc objek PDF dalam memori ke dalam fail tertentu.

resume/pdf/PDFResume

export interface ResumeFactory {
  createPDFResume(): PDFResume
  createMarkdownResume(): MarkdownResume
  createJSONResume(): JSONResume
}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Mengisytiharkan Kilang Konkrit kami

Sekarang kami telah menentukan jenis produk generik dan kilang abstrak kami, tiba masanya untuk meneruskan penciptaan ConcreteFactories kami yang sepadan dengan varian berbeza bagi setiap jenis produk generik.

Kami mempunyai 3 kemungkinan varian untuk resume: Kreatif , Minimalist dan Moden. Dan 3 jenis Produk generik: JSON , PDF dan Markdown.

Kilang abstrak ( ResumeFactory ) mentakrifkan 3 kaedah kilang yang bertanggungjawab untuk mencipta produk kami:

  • createPDFResume : mencipta contoh jenis PDFResume.
  • createMarkdownResume : mencipta contoh jenis MarkdownResume.
  • createJSONResume : mencipta contoh jenis JSONResume.

Untuk menyokong pelbagai varian bagi setiap produk, kami perlu mewujudkan 3 kilang konkrit.

Setiap Kilang konkrit akan mencipta 3 jenis produk tetapi dengan perisa tersendiri:

  1. CreativeResumeFactory mencipta produk daripada varian Kreatif.
  2. MinimalistResumeFactory mencipta produk daripada varian Minimalist.
  3. ModernResumeFactory mencipta produk daripada varian Moden.

kilang/CreativeResumeFactory

export class CreativeResumeFactory implements ResumeFactory {
  createPDFResume(): CreativePDFResume {
    return new CreativePDFResume() // CreativePDFResume implements PDFResume
  }

  createMarkdownResume(): CreativeMarkdownResume {
    return new CreativeMarkdownResume() // CreativeMarkdownResume implements MarkdownResume
  }

  createJSONResume(): CreativeJSONResume {
    return new CreativeJSONResume() // CreativeJSONResume implements JSONResume
  }
}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • Kaedah kilang CreativeResumeFactory mengembalikan varian produk konkrit kreatif untuk setiap jenis produk.

kilang/MinimalistResumeFactory

// User inputs...
let theme = "minimalist"
let format = "pdf"

let factory: ResumeFactory

switch (theme) {
  case "minimalist":
    factory = new MinimalistResumeFactory()
    break
  case "modern":
    factory = new ModernResumeFactory()
    break
  case "creative":
    factory = new CreativeResumeFactory()
    break
  default:
    throw new Error("Invalid theme.")
}

const userInput = await getUserInput()
let resume

switch (format) {
  case "pdf":
    resume = factory.createPDFResume()
    break
  case "markdown":
    resume = factory.createMarkdownResume()
    break
  case "json":
    resume = factory.createJSONResume()
    break
  default:
    throw new Error("Invalid format.")
}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • Kaedah kilang MinimalistResumeFactory mengembalikan varian produk konkrit minimalis untuk setiap jenis produk.

kilang/ModernResumeFactory

export abstract class PDFResume {}
export abstract class JSONResume {}
export abstract class MarkdownResume {}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • Kaedah kilang ModernResumeFactory mengembalikan varian produk konkrit moden untuk setiap jenis produk.

Produk Konkrit Kilang Resume Kreatif

Sekarang, mari buat ConcreteProducts sebelumnya yang dikembalikan oleh CreativeResumeFactory

Resume PDF :

resume/pdf/CreativePDFResume

export interface ResumeFactory {
  createPDFResume(): PDFResume
  createMarkdownResume(): MarkdownResume
  createJSONResume(): JSONResume
}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Resume Markdown :

resume/markdown/CreativeMarkdownResume

export class CreativeResumeFactory implements ResumeFactory {
  createPDFResume(): CreativePDFResume {
    return new CreativePDFResume() // CreativePDFResume implements PDFResume
  }

  createMarkdownResume(): CreativeMarkdownResume {
    return new CreativeMarkdownResume() // CreativeMarkdownResume implements MarkdownResume
  }

  createJSONResume(): CreativeJSONResume {
    return new CreativeJSONResume() // CreativeJSONResume implements JSONResume
  }
}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

JSON Resume :

resume/json/CreativeJSONResume

// User inputs...
let theme = "minimalist"
let format = "pdf"

let factory: ResumeFactory

switch (theme) {
  case "minimalist":
    factory = new MinimalistResumeFactory()
    break
  case "modern":
    factory = new ModernResumeFactory()
    break
  case "creative":
    factory = new CreativeResumeFactory()
    break
  default:
    throw new Error("Invalid theme.")
}

const userInput = await getUserInput()
let resume

switch (format) {
  case "pdf":
    resume = factory.createPDFResume()
    break
  case "markdown":
    resume = factory.createMarkdownResume()
    break
  case "json":
    resume = factory.createJSONResume()
    break
  default:
    throw new Error("Invalid format.")
}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Produk Konkrit Kilang Resume Minimalis

Seterusnya, mari buat ConcreteProducts sebelumnya yang dikembalikan oleh MinimalistResumeFactory

Resume PDF :

resume/pdf/MinimalistPDFResume

npm install
npm start

Salin selepas log masuk

Resume Markdown :

resume/markdown/MinimalistMarkdownResume

export type ResumeData = {
  name: string
  email: string
  phone: string
  experience: Experience[]
}

export type Experience = {
  company: string
  position: string
  startDate: string
  endDate: string
  description: string
}

Salin selepas log masuk

JSON Resume :

resume/json/MinimalistJSONResume

import { JSONResume } from "../resumes/json/JSONResume"
import { MarkdownResume } from "../resumes/markdown/MarkdownResume"
import { PDFResume } from "../resumes/pdf/PdfResume"

export interface ResumeFactory {
  createPDFResume(): PDFResume
  createMarkdownResume(): MarkdownResume
  createJSONResume(): JSONResume
}

Salin selepas log masuk

Produk Konkrit Kilang Resume Moden

Akhir sekali, mari buat ConcreteProducts sebelumnya yang dikembalikan oleh ModernResumeFactory

Resume PDF :

resume/pdf/ModernPDFResume

import * as fs from "fs/promises"

import { ResumeData } from "../../interfaces/Types"

export abstract class JSONResume {
  protected data!: ResumeData & { style: string }

  abstract generate(data: ResumeData): void

  async saveToFile(fileName: string): Promise<void> {
    await fs.writeFile(fileName, JSON.stringify(this.data, null, 2))
  }

  getData(): any {
    return this.data
  }
}

Salin selepas log masuk

Resume Markdown :

resume/markdown/ModernMarkdownResume

import * as fs from "fs/promises"

import { ResumeData } from "../../interfaces/Types"

export abstract class MarkdownResume {
  protected content: string = ""

  abstract generate(data: ResumeData): void

  async saveToFile(fileName: string): Promise<void> {
    await fs.writeFile(fileName, this.content)
  }

  getContent(): string {
    return this.content
  }
}

Salin selepas log masuk

JSON Resume :

resume/json/ModernJSONResume

import * as fs from "fs"

import PDFDocument from "pdfkit"

import { ResumeData } from "../../interfaces/Types"

export abstract class PDFResume {
  protected doc: PDFKit.PDFDocument

  constructor() {
    this.doc = new PDFDocument()
  }

  abstract generate(data: ResumeData): void

  async saveToFile(fileName: string): Promise<void> {
    const stream = fs.createWriteStream(fileName)
    this.doc.pipe(stream)
    this.doc.end()

    await new Promise<void>((resolve, reject) => {
      stream.on("finish", resolve)
      stream.on("error", reject)
    })
  }

  getBuffer(): Buffer {
    return this.doc.read() as Buffer
  }
}

Salin selepas log masuk

Menggunakan Kilang Kami dalam Fail Index.ts kami

Mari kita mula membuahkan hasil kerja kita sebelum ini dengan menggunakan kilang kami dalam kod pelanggan.

Lihat bagaimana kini kami boleh menggunakan perpustakaan pembina resume kami dengan cara yang sangat bersih dengan hanya menggunakan kilang kami.

Pengguna hanya perlu menyediakan dua perkara:

  1. Jenis Produk : Apakah jenis PDF yang dia mahu buat?
  2. Tema : Apakah jenis gaya resume yang dia lebih suka?

index.ts

import { ResumeFactory } from "../interfaces/ResumeFactory"
import { CreativeJSONResume } from "../resumes/json/CreativeJSONResume"
import { CreativeMarkdownResume } from "../resumes/markdown/CreativeMarkdownResume"
import { CreativePDFResume } from "../resumes/pdf/CreativePDFResume"

export class CreativeResumeFactory implements ResumeFactory {
  createPDFResume(): CreativePDFResume {
    return new CreativePDFResume() // CreativePDFResume extends PDFResume
  }

  createMarkdownResume(): CreativeMarkdownResume {
    return new CreativeMarkdownResume() // CreativeMarkdownResume extends MarkdownResume
  }

  createJSONResume(): CreativeJSONResume {
    return new CreativeJSONResume() // CreativeJSONResume extends JSONResume
  }
}

Salin selepas log masuk

Kod di atas berfungsi dalam tiga langkah:

  1. Input Pengguna: Kami mula-mula mendapat nilai tema dan format.
  2. Memilih Kilang : Kemudian kami membuat instantiate kilang yang sepadan berdasarkan nilai tema.
  3. Mencipta Produk : Akhir sekali, kami memanggil kaedah kilang yang sepadan bergantung pada format yang dipilih.

Pengguna tidak mengambil berat tentang cara produk dan varian sepadannya dicipta; mereka hanya perlu memilih tema dan format , dan itu sahaja - produk yang sepadan akan dibuat seperti yang diminta.

Kod pelanggan kini mantap untuk perubahan. Jika kami ingin menambah tema atau gaya baharu, kami boleh mencipta kilang baharu yang bertanggungjawab untuk melakukannya.

Kami telah menggunakan perpustakaan kapur untuk mewarnai log terminal kami bergantung pada makna semantiknya.

Untuk mendapatkan input daripada pengguna apl CLI, kami telah menggunakan pakej inquirer, yang menyediakan cara yang sangat menarik dan mesra pengguna untuk mendapatkan pelbagai jenis input daripada pengguna.

  1. Fungsi getUserInput digunakan untuk mendapatkan maklumat resume utama: nama, e-mel, telefon.
  2. Fungsi utiliti getExperience telah digunakan untuk mendapatkan semula maklumat pengalaman daripada pengguna secara rekursif. Dalam erti kata lain, ia menggesa pengguna untuk mengisi maklumat pengalaman untuk entri pertama, kemudian bertanya sama ada mereka mempunyai pengalaman lain untuk ditambah. Jika jawapannya tidak, fungsi itu hanya kembali; sebaliknya, jika mereka memilih ya, mereka akan diminta sekali lagi untuk mengisi maklumat pengalaman seterusnya.

utils/userInput

export abstract class PDFResume {}
export abstract class JSONResume {}
export abstract class MarkdownResume {}

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kesimpulan

Corak Kilang Abstrak ialah alat yang berkuasa dalam senjata pereka perisian dan pembangun. Ia menyediakan pendekatan berstruktur untuk mencipta keluarga objek berkaitan tanpa menyatakan kelas konkritnya. Corak ini amat berguna apabila:

  1. Sistem hendaklah bebas daripada cara produknya dicipta, digubah dan diwakili.
  2. Sistem perlu dikonfigurasikan dengan salah satu daripada berbilang keluarga produk.
  3. Sekumpulan objek produk yang berkaitan direka bentuk untuk digunakan bersama dan anda perlu melaksanakan kekangan ini.
  4. Anda ingin menyediakan perpustakaan kelas produk dan anda mahu mendedahkan hanya antara mukanya, bukan pelaksanaannya.

Dalam contoh praktikal kami, kami telah melihat bagaimana corak Kilang Abstrak boleh digunakan untuk mencipta sistem penjanaan resume yang fleksibel dan boleh dikembangkan. Sistem ini boleh dengan mudah menampung gaya resume baharu atau format output tanpa mengubah suai kod sedia ada, menunjukkan kuasa Prinsip Terbuka/Tertutup dalam tindakan.

Walaupun corak Kilang Abstrak menawarkan banyak faedah, adalah penting untuk ambil perhatian bahawa ia boleh memperkenalkan kerumitan tambahan kepada pangkalan kod anda. Oleh itu, adalah penting untuk menilai sama ada fleksibiliti yang diberikannya diperlukan untuk kes penggunaan khusus anda.

Dengan menguasai corak reka bentuk seperti Kilang Abstrak, anda akan lebih bersedia untuk mencipta sistem perisian yang teguh, fleksibel dan boleh diselenggara. Teruskan meneroka dan menggunakan corak ini dalam projek anda untuk meningkatkan kemahiran reka bentuk perisian anda.

Kenalan

Jika anda mempunyai sebarang soalan atau ingin membincangkan sesuatu dengan lebih lanjut, sila hubungi saya di sini.

Selamat mengekod!

Atas ialah kandungan terperinci Menguasai Corak Kilang Abstrak: Panduan Komprehensif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan