🔧 AI Nachrichten Major AI platforms go down in unprecedented simultaneous outage(03.09.2026 um 17:34 Uhr)
🔧 AI Nachrichten ChatGPT, Claude, and Grok Down? Users Report Widespread Outages(03.09.2026 um 19:14 Uhr)
🔧 AI Nachrichten OpenAI Launches GPT-6 Astra, Says We May Have Entered the AGI Era(03.09.2026 um 22:08 Uhr)
🔧 AI Nachrichten Claude Comes to CarPlay as Fifth Major AI Chatbot App(05.09.2026 um 05:31 Uhr)
🔧 AI Nachrichten OpenAI’s GPT-6 Astra Is AGI, Says NVIDIA CEO Jensen Huang(07.09.2026 um 06:31 Uhr)
🔧 AI Nachrichten Blame AI companies for Mac mini and Mac Studio shortage(31.08.2026 um 10:32 Uhr)
🔧 AI Nachrichten Major AI platforms go down in unprecedented simultaneous outage(03.09.2026 um 17:34 Uhr)
🔧 AI Nachrichten ChatGPT, Claude, and Grok Down? Users Report Widespread Outages(03.09.2026 um 19:14 Uhr)
🔧 AI Nachrichten OpenAI Launches GPT-6 Astra, Says We May Have Entered the AGI Era(03.09.2026 um 22:08 Uhr)
🔧 AI Nachrichten Claude Comes to CarPlay as Fifth Major AI Chatbot App(05.09.2026 um 05:31 Uhr)
🔧 AI Nachrichten OpenAI’s GPT-6 Astra Is AGI, Says NVIDIA CEO Jensen Huang(07.09.2026 um 06:31 Uhr)
🔧 AI Nachrichten Blame AI companies for Mac mini and Mac Studio shortage(31.08.2026 um 10:32 Uhr)

🔧 Programmierung 🕛 kürzlich 14 Min Lesezeit
0

Mastering the Builder Pattern: Create a Dynamic AI Prompt Generator CLI

↗ Quelle (dev.to)
🗣️ Stimme:
📑 Inhaltsübersicht

Have you ever encountered a case in your development journey where you had to deal with complex objects? Maybe because they either have too many parameters, which can even be nested, or require many building steps and complex logic to be constructed.



Perhaps you want to design a module with a clean and easy interface without having to scatter or think about the creation code of your complex objects every time!



That's where the builder design pattern comes in!



Throughout this tutorial, we will be explaining everything about the builder design pattern, then we will build a CLI Node.js application for generating a DALL-E 3 optimized image generation prompt using the builder design pattern.



The final code is available in this



The typical builder design pattern consists of 4 main classes:




  1. Builder : The builder interface should only define the construction methods without the build() method, which is responsible for returning the created entity.


  2. Concrete Builder Classes : Each concrete Builder provides its own implementation of the Builder Interface methods so that it can produce its own variant of the object (instance of Product1 or Product2 ).


  3. Client : You can think of the client as the top-level consumer of our objects, the user who is importing library modules or the entry point of our application.


  4. Director : Even the same builder object can produce many variants of the object.





CODE
const promptBuilder = new PromptBuilder()
const prompt1 = promptBuilder.buildStep1().buildStep2().build()

const prompt2 = promptBuilder.buildStep1().buildStep3().build()







As you can see from the code above, there is a big need for some entity to take the responsibility of directing or orchestrating the different possible combination sequences of calls to the builder methods, as each sequence may produce a different resulting object.



So can we further abstract the process and provide an even simpler interface for the client code?



That's where the Director class comes in. The director takes more responsibilities from the client and allows us to factor all of those builder sequence calls and reuse them as needed.




CODE
class Director {
private builder: PromptBuilder
constructor() {}

setBuilder(builder: PromptBuilder) {
this.builder = builder
}

makePrompt1() {
return this.builder.buildStep1().buildStep2().build()
}

makePrompt2() {
return this.builder.buildStep1().buildStep3().build()
}
}








Client code





CODE
const director = new Director()
const builder = new PromptBuilder()
director.setBuilder(builder)
const prompt1 = director.makePrompt1()
const prompt2 = director.makePrompt2()







As you can see from the code above, the client code doesn't need to know about the details for creating prompt1 or prompt2. It just calls the director, sets the correct builder object, and then calls the makePrompt methods.






Practical Scenario



To further demonstrate the builder design pattern's usefulness, let's build a prompt engineering image generation AI CLI tool from scratch.



The source code for this CLI app is available



Then you will have to enter the subject of your prompt. Let's stick with cheese eating burger.



Depending on your choice, you will get the following text prompts as a result:



Realistic Style Prompt :




CODE
Create a realistic photo of a cheese eating a burger in the Swiss Alps during golden hour.
The weather should be partly cloudy. Use a DSLR camera with a Wide Angle lens at 16mm.
Set the aperture to f/11, ISO to 100, and shutter speed to 1/60.
The lighting should be Natural with a Rule of Thirds composition.
Capture the scene from a low angle view. Include rocky terrain, alpine flowers in the foreground,
and snow-capped peaks, dramatic clouds in the background.
Use a Vibrant color scheme and render at 2048x2048 resolution.
In post-processing, apply HDR tone mapping and clarity enhancement.







Digital Art Style Prompt :




CODE
Create a digital art piece featuring a cheese eating a burger in a Cyberpunk style.
Use a color palette of neon blue, electric purple, acid green, deep black. Apply the Digital Pen technique
on a canvas of 1920x1080 at 2048x2048 resolution.
Use 15 layers and follow the Leading Lines composition rule.
Render the scene from a bird's eye view with volumetric fog with light shafts lighting.
Include texture details like grungy surfaces and holographic reflections.
The background should depict a dystopian megacity.
In the foreground, feature flying vehicles, towering skyscrapers, neon signs.
The overall mood should be gritty, high-tech, atmospheric.
Draw inspiration from Blade Runner and Ghost in the Shell.
Finally, apply digital effects including bloom effect, chromatic aberration, film grain.







Copy the previous commands and then paste them into ChatGPT. ChatGPT will use the DALL-E 3 model to generate the images.



Realistic Image Prompt Result



Digital Art Image Prompt Result





Remember the prompt parameters' complexity and the expertise needed to construct each type of prompt, not to mention the ugly constructor calls which are needed.




CODE
this.prompt = new RealisticPhotoPrompt(
"",
"",
"",
"",
CameraType.DSLR,
LensType.WideAngle,
24,
"f/8",
100,
"1/125",
LightingCondition.Natural,
CompositionRule.RuleOfThirds,
"",
[],
[],
ColorScheme.Vibrant,
ImageResolution.Medium,
[]
)








Disclaimer: This ugly constructor call is not a big issue in JavaScript because we can pass a configuration object with all the properties being nullable.




To abstract the process of building the prompt and make our code open for extension and closed for modification (O in SOLID), and to make using our prompt generation library seamless or easier for our library clients, we will be opting to implement the builder design pattern.



Let's start by declaring the generic prompt builder interface.



The interface declares a bunch of methods:





  1. buildBaseProperties , buildTechnicalDetails , and buildArtisticElements are the steps for constructing either a Realistic or Digital Art prompt.


  2. setSubject is a shared method between all of our prompt builders; it's self-explanatory and will be used to set the prompt subject.




builders.ts





CODE
interface PromptBuilder {
buildBaseProperties(): this
buildTechnicalDetails(): this
buildArtisticElements(): this
setSubject(subject: string): this
}


class RealisticPhotoPromptBuilder implements PromptBuilder {
private prompt: RealisticPhotoPrompt

constructor() {
this.reset()
}

private reset(): void {
this.prompt = new RealisticPhotoPrompt(
"",
"",
"",
"",
CameraType.DSLR,
LensType.WideAngle,
24,
"f/8",
100,
"1/125",
LightingCondition.Natural,
CompositionRule.RuleOfThirds,
"",
[],
[],
ColorScheme.Vibrant,
ImageResolution.Medium,
[]
)
}

setSubject(subject: string): this {
this.prompt.subject = subject
return this
}

buildBaseProperties(): this {
this.prompt.location = "Swiss Alps"
this.prompt.timeOfDay = "golden hour"
this.prompt.weather = "partly cloudy"
return this
}

buildTechnicalDetails(): this {
this.prompt.camera = CameraType.DSLR
this.prompt.lens = LensType.WideAngle
this.prompt.focalLength = 16
this.prompt.aperture = "f/11"
this.prompt.iso = 100
this.prompt.shutterSpeed = "1/60"
this.prompt.lighting = LightingCondition.Natural
this.prompt.resolution = ImageResolution.High
return this
}

buildArtisticElements(): this {
this.prompt.composition = CompositionRule.RuleOfThirds
this.prompt.perspective = "low angle view"
this.prompt.foregroundElements = ["rocky terrain", "alpine flowers"]
this.prompt.backgroundElements = ["snow-capped peaks", "dramatic clouds"]
this.prompt.colorScheme = ColorScheme.Vibrant
this.prompt.postProcessing = ["HDR tone mapping", "clarity enhancement"]
return this
}

build(): RealisticPhotoPrompt {
const result = Object.assign({}, this.prompt)
this.reset()
return result
}
}








builders.ts





CODE
class DigitalArtPromptBuilder implements PromptBuilder {
private prompt: DigitalArtPrompt

constructor() {
this.reset()
}

private reset(): void {
this.prompt = new DigitalArtPrompt(
"",
ArtStyle.Impressionist,
[],
BrushTechnique.Impasto,
{ width: 1920, height: 1080, resolution: ImageResolution.Medium },
10,
CompositionRule.GoldenRatio,
"",
"",
[],
"",
[],
[],
[],
[]
)
}

setSubject(subject: string): this {
this.prompt.subject = subject
return this
}

buildBaseProperties(): this {
this.prompt.artStyle = ArtStyle.Cyberpunk
this.prompt.colorPalette = [
"neon blue",
"electric purple",
"acid green",
"deep black",
]
this.prompt.canvas.resolution = ImageResolution.High
return this
}

buildTechnicalDetails(): this {
this.prompt.brushTechnique = BrushTechnique.DigitalPen
this.prompt.layers = 15
this.prompt.composition = CompositionRule.LeadingLines
this.prompt.perspective = "bird's eye view"
this.prompt.lightingEffect = "volumetric fog with light shafts"
return this
}

buildArtisticElements(): this {
this.prompt.textureDetails = ["grungy surfaces", "holographic reflections"]
this.prompt.backgroundTheme = "dystopian megacity"
this.prompt.foregroundElements = [
"flying vehicles",
"towering skyscrapers",
"neon signs",
]
this.prompt.moodKeywords = ["gritty", "high-tech", "atmospheric"]
this.prompt.artisticInfluences = ["Blade Runner", "Ghost in the Shell"]
this.prompt.digitalEffects = [
"bloom effect",
"chromatic aberration",
"film grain",
]
return this
}

build(): DigitalArtPrompt {
const result = Object.assign({}, this.prompt)
this.reset()
return result
}
}







As you can see from the implementations above, each builder chooses to build its own kind of prompt (the final prompt shapes are different) while sticking to the same building steps defined by the PromptBuilder contract!



Now, let's move on to our Director class definition.




director.ts





CODE
import { PromptBuilder } from "./builders"

export class PromptDirector {
private builder: PromptBuilder

setBuilder(builder: PromptBuilder): void {
this.builder = builder
}

makePrompt(subject: string): void {
this.builder
.setSubject(subject)
.buildBaseProperties()
.buildTechnicalDetails()
.buildArtisticElements()
}
}







The Director class wraps a PromptBuilder and allows us to create a prompt configuration which consists of calling all the builder methods starting from setSubject to buildArtisticElements.



This will simplify our client code in the index.ts file, which we will see in the next section.




serializers.ts





CODE
import { DigitalArtPrompt, RealisticPhotoPrompt } from "./prompts"

// Serialization functions
export function serializeRealisticPhotoPrompt(
prompt: RealisticPhotoPrompt
): string {
return `Create a realistic photo of ${prompt.subject} in the ${prompt.location} during ${prompt.timeOfDay}.
The weather should be ${prompt.weather}. Use a ${prompt.camera} camera with a ${prompt.lens} lens at ${prompt.focalLength}mm.
Set the aperture to ${prompt.aperture}, ISO to ${prompt.iso}, and shutter speed to ${prompt.shutterSpeed}.
The lighting should be ${prompt.lighting} with a ${prompt.composition} composition.
Capture the scene from a ${prompt.perspective}. Include ${prompt.foregroundElements.join(", ")} in the foreground,
and ${prompt.backgroundElements.join(", ")} in the background.
Use a ${prompt.colorScheme} color scheme and render at ${prompt.resolution} resolution.
In post-processing, apply ${prompt.postProcessing.join(" and ")}.`
}

export function serializeDigitalArtPrompt(prompt: DigitalArtPrompt): string {
return `Create a digital art piece featuring ${prompt.subject} in a ${prompt.artStyle} style.
Use a color palette of ${prompt.colorPalette.join(", ")}. Apply the ${prompt.brushTechnique} technique
on a canvas of ${prompt.canvas.width}x${prompt.canvas.height} at ${prompt.canvas.resolution} resolution.
Use ${prompt.layers} layers and follow the ${prompt.composition} composition rule.
Render the scene from a ${prompt.perspective} with ${prompt.lightingEffect} lighting.
Include texture details like ${prompt.textureDetails.join(" and ")}.
The background should depict a ${prompt.backgroundTheme}.
In the foreground, feature ${prompt.foregroundElements.join(", ")}.
The overall mood should be ${prompt.moodKeywords.join(", ")}.
Draw inspiration from ${prompt.artisticInfluences.join(" and ")}.
Finally, apply digital effects including ${prompt.digitalEffects.join(", ")}.`
}







To print the final prompt text to the terminal console, I've implemented some utility serialization functions.



Now our prompt library generation code is ready. Let's make use of it in the index.ts file.




index.ts





CODE
import inquirer from "inquirer"

import {
DigitalArtPromptBuilder,
PromptBuilder,
RealisticPhotoPromptBuilder,
} from "./builders"
import { PromptDirector } from "./director"
import { DigitalArtPrompt, RealisticPhotoPrompt } from "./prompts"
import {
serializeDigitalArtPrompt,
serializeRealisticPhotoPrompt,
} from "./serializers"

async function main() {
console.log("=====================")
console.log("Image Prompt Builder")
console.log("=====================")

const director = new PromptDirector()

let builder: PromptBuilder
let prompt: RealisticPhotoPrompt | DigitalArtPrompt
const { choice, subject } = await getUserInput()

if (choice === "Realistic Photo") {
builder = new RealisticPhotoPromptBuilder()
director.setBuilder(builder)
director.makePrompt(subject)
prompt = builder.build() as RealisticPhotoPrompt
console.log("\nGenerated Prompt:")
console.log(serializeRealisticPhotoPrompt(prompt))
} else {
builder = new DigitalArtPromptBuilder()
director.setBuilder(builder)
director.makePrompt(subject)
prompt = builder.build() as DigitalArtPrompt
console.log("\nGenerated Prompt:")
console.log(serializeDigitalArtPrompt(prompt))
}
}

main().catch(console.error)

// get user input function
async function getUserInput() {
const input = await inquirer.prompt([
{
type: "list",
name: "choice",
message: "Choose prompt type:",
choices: ["Realistic Photo", "Digital Art"],
},
{
type: "input",
name: "subject",
message: "Enter the subject for your image:",
},
])

return input
}







The code above performs the following actions:




  1. Prompt the user to select a prompt style and then a subject using the inquirer package: getUserInput.

  2. After getting both the subject and the art style from the user, the client code uses only two components from our library: The PromptBuilder and the Director.

  3. We start by instantiating the Director.

  4. Then, depending on the selected prompt style, we instantiate the corresponding builder and set it to the Director class.

  5. Finally, we call the director.makePrompt method with the chosen subject as an argument, get the prompt from the builder , and print the serialized prompt to the terminal console.




Remember: it's not possible to get the prompt from the director because the shape of the prompt produced by each builder type is different.







Conclusion



The Builder design pattern proves to be an excellent solution for creating complex objects with multiple configurations, as demonstrated in our AI image prompt generation CLI application. Here's why the Builder pattern was beneficial in this scenario:




  1. Simplified Object Creation : The pattern allowed us to create intricate RealisticPhotoPrompt and DigitalArtPrompt objects without exposing their complex construction process to the client code.


  2. Flexibility : By using separate builder classes for each prompt type, we could easily add new prompt types or modify existing ones without changing the client code.


  3. Code Organization : The pattern helped separate the construction logic from the representation, making the code more modular and easier to maintain.


  4. Reusability : The PromptDirector class allowed us to reuse the same construction process for different types of prompts, enhancing code reusability.


  5. Abstraction : The client code in index.ts remained simple and focused on high-level logic, while the complexities of prompt construction were abstracted away in the builder classes.







Contact



If you have any questions or want to discuss something further, feel free to Contact me here.



Happy coding!

Vollständiger Original-Bericht
Ausführliche Details, Code-Beispiele & Hersteller-Stellungnahme auf dev.to.
↗ Original-Artikel auf dev.to lesen
Wie bewertest du diesen Beitrag?
1 Klick Feedback
Teilen mit Netzwerk & Team:

Community-Analysen & Experten-Meinungen 0

Verfasse deine eigene Analyse, teile Workarounds oder diskutiere diesen Vorfall im Blog.
Noch keine Community-Analyse verfasst. Markiere einen Textabschnitt oder klicke oben auf Eigene Analyse verfassen“!
Community Pulse: Relevanz-Einschätzung
1 Klick Experten-Votum
🔴 Akute Relevanz 0%
🟡 In Evaluierung 0%
🟢 Keine Auswirkung 0%
Spannende Innovation 0%
Verwandte Story-Cluster & Quellen (Vektor-KI)
Port 8095 Engine
3 Quellen
GPT-6 Astra Release Today? OpenAI’s Next Major AI Model Is Almost Here
1 Quelle
Apple accuses OpenAI of destroying evidence as trade-secrets fight intensifies
1 Quelle
Major AI platforms go down in unprecedented simultaneous outage
Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten Mastering the Builder Pattern: Create a Dynamic AI Prompt Generator CLI

Thematisch verwandte Begriffe: Mastering, Builder, Pattern, Create · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...