<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Bruno Caxias</title>
    <description>The latest articles on Forem by Bruno Caxias (@bccaxias).</description>
    <link>https://forem.com/bccaxias</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1271437%2Fbc3cb50f-ee96-4425-a4c9-4a7ca88b3d9e.jpg</url>
      <title>Forem: Bruno Caxias</title>
      <link>https://forem.com/bccaxias</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/bccaxias"/>
    <language>en</language>
    <item>
      <title>Simplifying Design Patterns : Singleton</title>
      <dc:creator>Bruno Caxias</dc:creator>
      <pubDate>Mon, 14 Apr 2025 16:49:58 +0000</pubDate>
      <link>https://forem.com/bccaxias/simplifying-design-patterns-singleton-13ji</link>
      <guid>https://forem.com/bccaxias/simplifying-design-patterns-singleton-13ji</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Design patterns are proven solutions to common software design problems. In this article, we’ll simplify the &lt;strong&gt;Singleton&lt;/strong&gt; pattern—explaining how it works, when to use it, and how to implement it with clear examples. The examples are inspired by &lt;a href="https://refactoring.guru" rel="noopener noreferrer"&gt;Refactoring Guru&lt;/a&gt; and &lt;em&gt;Dive Into Design Patterns&lt;/em&gt; (Alexander Shvets), distilled to their essence.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;How Does the Singleton Pattern Work?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Singleton&lt;/strong&gt; is a &lt;strong&gt;creational&lt;/strong&gt; design pattern that ensures a class has &lt;strong&gt;only one instance&lt;/strong&gt; and provides a &lt;strong&gt;global access point&lt;/strong&gt; to it.  &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Example Scenario: A Restaurant Kitchen&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Imagine a restaurant where:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There is a &lt;code&gt;kitchen&lt;/code&gt; that needs only one &lt;code&gt;oven&lt;/code&gt; for every &lt;code&gt;dish&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Instead of starting a new &lt;code&gt;oven&lt;/code&gt; every time a &lt;code&gt;dish&lt;/code&gt; is cooked, the &lt;code&gt;kitchen&lt;/code&gt; reuses the existing one.&lt;/li&gt;
&lt;li&gt;If the &lt;code&gt;oven&lt;/code&gt; isn’t on yet, it gets started once. After that, every dish uses the same &lt;code&gt;oven&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everytime a &lt;code&gt;dish&lt;/code&gt; is about to be cooked and the &lt;code&gt;oven&lt;/code&gt; is called to start, it must check if it is already instantiated, if it is then the instance is returned if not the constructor must be called.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;When to Use the Singleton Pattern?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use this pattern when:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You have a class in your program that should just have one single instance available, like a database object.&lt;/li&gt;
&lt;li&gt;You need strict control over global variables&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How to Implement the Singleton Pattern&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Step-by-Step (Restaurant Example)&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define a Private Static Instance&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The class holds its &lt;strong&gt;only instance&lt;/strong&gt; in a private static field:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Oven&lt;/span&gt; &lt;span class="n"&gt;_instance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lock the Constructor&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make the constructor &lt;strong&gt;private&lt;/strong&gt; to block external instantiation:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;Oven&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
 &lt;span class="p"&gt;{&lt;/span&gt;  
     &lt;span class="n"&gt;IsOn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Initialization logic  &lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Controlled Access Method&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provide a &lt;strong&gt;public static method&lt;/strong&gt; (&lt;code&gt;GetInstance&lt;/code&gt;) with lazy initialization:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Oven&lt;/span&gt; &lt;span class="nf"&gt;GetInstance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
 &lt;span class="p"&gt;{&lt;/span&gt;  
     &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_instance&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
     &lt;span class="p"&gt;{&lt;/span&gt;  
         &lt;span class="n"&gt;_instance&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Oven&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Creates instance only on first call  &lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;  
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_instance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
 &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add Thread Safety (Optional)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For multi-threaded kitchens, use &lt;code&gt;lock&lt;/code&gt; or &lt;code&gt;Lazy&amp;lt;T&amp;gt;&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;_lock&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
 &lt;span class="c1"&gt;// ...  &lt;/span&gt;
 &lt;span class="k"&gt;lock&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_lock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
 &lt;span class="p"&gt;{&lt;/span&gt;  
     &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_instance&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;_instance&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Oven&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
 &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modern Approach: Use &lt;code&gt;Lazy&amp;lt;T&amp;gt;&lt;/code&gt; (Recommended)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace manual checks with C#'s built-in lazy initialization:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;Lazy&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Oven&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_lazyOven&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Lazy&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Oven&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Oven&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;  
 &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Oven&lt;/span&gt; &lt;span class="n"&gt;Instance&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_lazyOven&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Diagram&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyjglafyyzjnqjdwnt9p9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyjglafyyzjnqjdwnt9p9.png" alt="Singleton Structure" width="750" height="439"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>designpatterns</category>
      <category>tutorial</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Simplifying Design Patterns : Prototype</title>
      <dc:creator>Bruno Caxias</dc:creator>
      <pubDate>Fri, 11 Apr 2025 20:48:27 +0000</pubDate>
      <link>https://forem.com/bccaxias/simplifying-design-patterns-prototype-15f8</link>
      <guid>https://forem.com/bccaxias/simplifying-design-patterns-prototype-15f8</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Design patterns are proven solutions to common software design problems. In this article, we’ll simplify the &lt;strong&gt;Prototype&lt;/strong&gt; pattern—explaining how it works, when to use it, and how to implement it with clear examples. The examples are inspired by &lt;a href="https://refactoring.guru" rel="noopener noreferrer"&gt;Refactoring Guru&lt;/a&gt; and &lt;em&gt;Dive Into Design Patterns&lt;/em&gt; (Alexander Shvets), distilled to their essence.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;How Does the Prototype Pattern Work?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Prototype&lt;/strong&gt; is a creational design pattern that allows you to create copies of existing objects &lt;strong&gt;without making your code dependent on their concrete classes&lt;/strong&gt;. This is useful when object creation is costly or complex (e.g., when objects have private fields or require deep copying).&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Example Scenario: A Restaurant Kitchen&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Imagine a restaurant where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have a &lt;code&gt;Pasta&lt;/code&gt; object that you want to duplicate (e.g., for a new order).&lt;/li&gt;
&lt;li&gt;Some of its properties might be &lt;strong&gt;private&lt;/strong&gt; or require &lt;strong&gt;complex initialization&lt;/strong&gt; (e.g., ingredients, cooking time).&lt;/li&gt;
&lt;li&gt;Instead of manually reconstructing the object (which could introduce errors or tight coupling), you:

&lt;ul&gt;
&lt;li&gt;Define a &lt;strong&gt;&lt;code&gt;Prototype&lt;/code&gt; interface&lt;/strong&gt; with a method like &lt;code&gt;clone()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Make the &lt;code&gt;Pasta&lt;/code&gt; class implement this interface, providing its own &lt;strong&gt;concrete cloning logic&lt;/strong&gt; (e.g., shallow or deep copy).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Now, the kitchen (client code) can simply call &lt;code&gt;pasta.clone()&lt;/code&gt; to get an identical copy without knowing the internal details of the &lt;code&gt;Pasta&lt;/code&gt; class.&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;When to Use the Prototype?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use this pattern when:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your code is not supposed to depend on concrete classes of objects you need to copy&lt;/li&gt;
&lt;li&gt;You want to reduce the amount of subclasses that only differ in the way they are initialized&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How to Implement the Prototype Pattern in C#&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Step-by-Step (Restaurant Example)&lt;/strong&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1. Define the Cloning Interface or Method&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Option A&lt;/strong&gt;: Create an &lt;code&gt;IPrototype&lt;/code&gt; interface.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IPrototype&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="nf"&gt;Clone&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Option B&lt;/strong&gt;: Add &lt;code&gt;Clone()&lt;/code&gt; directly to an existing hierarchy.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dish&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="n"&gt;Dish&lt;/span&gt; &lt;span class="nf"&gt;Clone&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;2. Implement the Copying Logic&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Option A&lt;/strong&gt;: Use a &lt;strong&gt;copy constructor&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pasta&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPrototype&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Pasta&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Ingredients&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// Copy constructor&lt;/span&gt;
      &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Pasta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pasta&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ingredients&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ingredients&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Deep copy&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Pasta&lt;/span&gt; &lt;span class="nf"&gt;Clone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Pasta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Invokes copy constructor&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Option B&lt;/strong&gt;: Manual field copying (e.g., for languages without copy constructors).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pasta&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPrototype&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Pasta&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Ingredients&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Pasta&lt;/span&gt; &lt;span class="nf"&gt;Clone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Pasta&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="n"&gt;Ingredients&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ingredients&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Deep copy&lt;/span&gt;
          &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;3. Implement the &lt;code&gt;Clone()&lt;/code&gt; Method&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Ensure the method returns the &lt;strong&gt;concrete type&lt;/strong&gt; (avoid polymorphism issues).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// Correct (returns SpicyPasta):&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SpicyPasta&lt;/span&gt; &lt;span class="nf"&gt;Clone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SpicyPasta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Avoid&lt;/strong&gt; this (risky downcasting):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// Warning: Returns Pasta when cast to IPrototype&amp;lt;Pasta&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="n"&gt;Pasta&lt;/span&gt; &lt;span class="nf"&gt;Clone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SpicyPasta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Factory Method vs. Prototype in C#&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Factory Method&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Kitchen&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="n"&gt;Dish&lt;/span&gt; &lt;span class="nf"&gt;PrepareDish&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PastaKitchen&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Kitchen&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="n"&gt;Dish&lt;/span&gt; &lt;span class="nf"&gt;PrepareDish&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Pasta&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Creates from scratch&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prototype&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;  &lt;span class="n"&gt;Pasta&lt;/span&gt; &lt;span class="n"&gt;prototype&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Pasta&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Carbonara"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="n"&gt;Pasta&lt;/span&gt; &lt;span class="n"&gt;order1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Clone&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Copies existing object&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Diagram&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F32u2dn33p5loqw5ersi2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F32u2dn33p5loqw5ersi2.png" alt="Prototype Diagram" width="800" height="699"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>designpatterns</category>
      <category>tutorial</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Simplifying Design Patterns : Builder</title>
      <dc:creator>Bruno Caxias</dc:creator>
      <pubDate>Thu, 10 Apr 2025 01:56:35 +0000</pubDate>
      <link>https://forem.com/bccaxias/simplifying-design-patterns-builder-2c0h</link>
      <guid>https://forem.com/bccaxias/simplifying-design-patterns-builder-2c0h</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Design patterns are proven solutions to common software design problems. In this article, we’ll simplify the &lt;strong&gt;Builder&lt;/strong&gt; pattern—explaining how it works, when to use it, and how to implement it with clear examples. The examples are inspired by &lt;a href="https://refactoring.guru" rel="noopener noreferrer"&gt;Refactoring Guru&lt;/a&gt; and &lt;em&gt;Dive Into Design Patterns&lt;/em&gt; (Alexander Shvets), distilled to their essence.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;How Does the Builder Pattern Work?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Builder Pattern&lt;/strong&gt; is a creational design pattern that separates the construction of a complex object into &lt;strong&gt;step-by-step&lt;/strong&gt; processes. This allows the same construction logic to create &lt;strong&gt;different representations&lt;/strong&gt; of an object while avoiding overly complex constructors.  &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Example Scenario: A Restaurant Kitchen&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Imagine a restaurant kitchen where:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;All pasta dishes follow a base preparation flow&lt;/strong&gt;: boiling pasta, preparing sauce, adding garnishes, and serving.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some pastas require extra steps&lt;/strong&gt; (e.g., adding cheese, spices, or special toppings), but the core process remains consistent.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Without the Builder Pattern&lt;/strong&gt;, a &lt;code&gt;Pasta&lt;/code&gt; class would need a massive constructor with many parameters (most unused in most cases), leading to messy code and &lt;code&gt;null&lt;/code&gt; defaults.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define a &lt;code&gt;PastaBuilder&lt;/code&gt; interface&lt;/strong&gt; with methods for each construction step (e.g., &lt;code&gt;setPastaType()&lt;/code&gt;, &lt;code&gt;addSauce()&lt;/code&gt;, &lt;code&gt;addGarnish()&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement concrete builders&lt;/strong&gt; (e.g., &lt;code&gt;SpaghettiBuilder&lt;/code&gt;, &lt;code&gt;AlfredoBuilder&lt;/code&gt;) to handle variations.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Introduce a &lt;code&gt;Director&lt;/code&gt; (e.g., the head chef)&lt;/strong&gt; to enforce standardized recipes (e.g., "Vegetarian Pasta" or "Spicy Arrabbiata") by executing predefined steps.
&lt;/li&gt;
&lt;li&gt;Clients (or chefs) can either use the &lt;code&gt;Director&lt;/code&gt; for preconfigured dishes, &lt;strong&gt;or&lt;/strong&gt; Customize dishes directly via the &lt;code&gt;Builder&lt;/code&gt; for flexibility. &lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;When to Use the Builder?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use this pattern when:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You have enormous constructors&lt;/li&gt;
&lt;li&gt;You want different representations of the same product&lt;/li&gt;
&lt;li&gt;You are working with complex objects that can be constructed with steps&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;How to Implement the Builder&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Step-by-Step (Restaurant Example)&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Define the product by creating a &lt;code&gt;Pasta&lt;/code&gt; class with properties (type, sauce, garnish, etc.)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pasta&lt;/span&gt; 
   &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Sauce&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Garnish&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;HasCheese&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Create a interface builder declaring methods for each construction step (&lt;code&gt;SetPastaType&lt;/code&gt;, &lt;code&gt;AddSauce&lt;/code&gt;, etc.)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IPastaBuilder&lt;/span&gt; 
   &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SetPastaType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
       &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;AddSauce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;sauce&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
       &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;AddGarnish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;garnish&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
       &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;AddCheese&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;hasCheese&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
       &lt;span class="n"&gt;Pasta&lt;/span&gt; &lt;span class="nf"&gt;GetPasta&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Now implement concrete builders for each of the dishes, like &lt;code&gt;SpaghettiBuilder&lt;/code&gt; that implement the builder
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SpaghettiBuilder&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPastaBuilder&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Pasta&lt;/span&gt; &lt;span class="n"&gt;_pasta&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Pasta&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

       &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SetPastaType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_pasta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
       &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;AddSauce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;sauce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_pasta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sauce&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sauce&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
       &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;AddGarnish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;garnish&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_pasta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Garnish&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;garnish&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
       &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;AddCheese&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;hasCheese&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_pasta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HasCheese&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hasCheese&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
       &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Pasta&lt;/span&gt; &lt;span class="nf"&gt;GetPasta&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_pasta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Create a director to coordinate the calling of those step methods and what parameters must be sent to them
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Chef&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;IPastaBuilder&lt;/span&gt; &lt;span class="n"&gt;_builder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

       &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Chef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IPastaBuilder&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

       &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;MakeMargheritaPasta&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
       &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="n"&gt;_builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetPastaType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Spaghetti"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
           &lt;span class="n"&gt;_builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddSauce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Tomato"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
           &lt;span class="n"&gt;_builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddGarnish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Basil"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
           &lt;span class="n"&gt;_builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddCheese&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
       &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;In your client code instatiate a concrete builder and a director, passing the builder to the director for it to create the dish you want
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SpaghettiBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;chef&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Chef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

   &lt;span class="c1"&gt;// Standard recipe&lt;/span&gt;
   &lt;span class="n"&gt;chef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MakeMargheritaPasta&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="n"&gt;Pasta&lt;/span&gt; &lt;span class="n"&gt;margherita&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetPasta&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

   &lt;span class="c1"&gt;// Custom order (without Director)&lt;/span&gt;
   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;customBuilder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SpaghettiBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="n"&gt;customBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetPastaType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Penne"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;customBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddSauce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Alfredo"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Pasta&lt;/span&gt; &lt;span class="n"&gt;customPasta&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;customBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetPasta&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Diagram&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwterkmtc300kclguugln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwterkmtc300kclguugln.png" alt="Builder Structure" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>designpatterns</category>
      <category>tutorial</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Simplifying Design Patterns : Abstract Factory</title>
      <dc:creator>Bruno Caxias</dc:creator>
      <pubDate>Tue, 08 Apr 2025 23:25:12 +0000</pubDate>
      <link>https://forem.com/bccaxias/simplifying-design-patterns-abstract-factory-1epn</link>
      <guid>https://forem.com/bccaxias/simplifying-design-patterns-abstract-factory-1epn</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Design patterns are proven solutions to common software design problems. In this article, we'll simplify the &lt;strong&gt;Abstract Factory&lt;/strong&gt; pattern—explaining how it creates object families, when to use it, and how to implement it with kitchen-themed examples. Inspired by &lt;a href="https://refactoring.guru" rel="noopener noreferrer"&gt;Refactoring Guru&lt;/a&gt; and &lt;em&gt;Dive Into Design Patterns&lt;/em&gt; (Alexander Shvets).&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;How Does the Abstract Factory Work?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Abstract Factory&lt;/strong&gt; is a creational design pattern that &lt;strong&gt;produces families of related objects&lt;/strong&gt; without specifying their concrete classes.  &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Key Characteristics&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Creates &lt;strong&gt;multiple product types&lt;/strong&gt; (e.g., Pizza + Pasta + Burger)
&lt;/li&gt;
&lt;li&gt;Ensures created objects are &lt;strong&gt;compatible&lt;/strong&gt; (all Italian or all Mexican)
&lt;/li&gt;
&lt;li&gt;Uses &lt;strong&gt;composition over inheritance&lt;/strong&gt; (factories are injected)
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Example Scenario: Restaurant Kitchen&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Imagine a kitchen that needs:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multiple dish types&lt;/strong&gt; (Pizzas, Pastas, Burgers)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple cuisines&lt;/strong&gt; (Italian, American, Mexican)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Hardcoded kitchen (brittle)  &lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Kitchen&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
    &lt;span class="nc"&gt;Pizza&lt;/span&gt; &lt;span class="nf"&gt;makeItalianPizza&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{...}&lt;/span&gt;  
    &lt;span class="nc"&gt;Pasta&lt;/span&gt; &lt;span class="nf"&gt;makeAmericanPasta&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{...}&lt;/span&gt; &lt;span class="c1"&gt;// Mixed cuisines!  &lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ Abstract Factory solution  &lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;CuisineFactory&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
    &lt;span class="nc"&gt;Pizza&lt;/span&gt; &lt;span class="nf"&gt;createPizza&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  
    &lt;span class="nc"&gt;Pasta&lt;/span&gt; &lt;span class="nf"&gt;createPasta&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  
&lt;span class="o"&gt;}&lt;/span&gt;  

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ItalianFactory&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;CuisineFactory&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
    &lt;span class="nc"&gt;Pizza&lt;/span&gt; &lt;span class="nf"&gt;createPizza&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MargheritaPizza&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  
    &lt;span class="nc"&gt;Pasta&lt;/span&gt; &lt;span class="nf"&gt;createPasta&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AlfredoPasta&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  
&lt;span class="o"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;When to Use Abstract Factory?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use this pattern when:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Working with object families&lt;/strong&gt; – Your system needs groups of related products (e.g., GUI components, cuisine sets)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforcing compatibility&lt;/strong&gt; – Objects must work together (no "Italian Pizza + Mexican Pasta")
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switching configurations&lt;/strong&gt; – You need to change entire product families at runtime
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;How to Implement Abstract Factory&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Step-by-Step (Restaurant Example)&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Define Product Interfaces&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;   &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Pizza&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;bake&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  
   &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Pasta&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;boil&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create Concrete Products&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;   &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MargheritaPizza&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Pizza&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
       &lt;span class="nd"&gt;@Override&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;bake&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
           &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Baking thin-crust pizza"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  
       &lt;span class="o"&gt;}&lt;/span&gt;  
   &lt;span class="o"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Declare Abstract Factory&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;   &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;CuisineFactory&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
       &lt;span class="nc"&gt;Pizza&lt;/span&gt; &lt;span class="nf"&gt;createPizza&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  
       &lt;span class="nc"&gt;Pasta&lt;/span&gt; &lt;span class="nf"&gt;createPasta&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  
   &lt;span class="o"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Implement Factories per Cuisine&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;   &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MexicanFactory&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;CuisineFactory&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
       &lt;span class="nd"&gt;@Override&lt;/span&gt;  
       &lt;span class="nc"&gt;Pizza&lt;/span&gt; &lt;span class="nf"&gt;createPizza&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TacoPizza&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  

       &lt;span class="nd"&gt;@Override&lt;/span&gt;  
       &lt;span class="nc"&gt;Pasta&lt;/span&gt; &lt;span class="nf"&gt;createPasta&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ChipotlePasta&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  
   &lt;span class="o"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use in Client Code&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;   &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Kitchen&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
       &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;CuisineFactory&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  

       &lt;span class="nc"&gt;Kitchen&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CuisineFactory&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
           &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;factory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  
       &lt;span class="o"&gt;}&lt;/span&gt;  

       &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;prepareMeal&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
           &lt;span class="nc"&gt;Pizza&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createPizza&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  
           &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bake&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  
       &lt;span class="o"&gt;}&lt;/span&gt;  
   &lt;span class="o"&gt;}&lt;/span&gt;  

   &lt;span class="c1"&gt;// Usage:  &lt;/span&gt;
   &lt;span class="nc"&gt;Kitchen&lt;/span&gt; &lt;span class="n"&gt;italianKitchen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Kitchen&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ItalianFactory&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Extend with Variants (Optional)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;   &lt;span class="nc"&gt;Pizza&lt;/span&gt; &lt;span class="nf"&gt;createPizza&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PizzaStyle&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
           &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;NEAPOLITAN&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NeapolitanPizza&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  
           &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;SICILIAN&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SicilianPizza&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  
       &lt;span class="o"&gt;};&lt;/span&gt;  
   &lt;span class="o"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Why Avoid Hardcoding Factories?&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Problematic approach  &lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Kitchen&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
    &lt;span class="nc"&gt;Pizza&lt;/span&gt; &lt;span class="nf"&gt;makeItalianPizza&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{...}&lt;/span&gt;  
    &lt;span class="nc"&gt;Pasta&lt;/span&gt; &lt;span class="nf"&gt;makeMexicanPasta&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{...}&lt;/span&gt;  
    &lt;span class="nc"&gt;Burger&lt;/span&gt; &lt;span class="nf"&gt;makeAmericanBurger&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{...}&lt;/span&gt;  
&lt;span class="o"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mixed cuisines create incompatible meals
&lt;/li&gt;
&lt;li&gt;Adding new cuisines requires modifying Kitchen
&lt;/li&gt;
&lt;li&gt;Violates &lt;strong&gt;Single Responsibility Principle&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Diagram&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0gi42m7ee8qzfgb3vnz6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0gi42m7ee8qzfgb3vnz6.png" alt="Abstract Factory Structure" width="800" height="350"&gt;&lt;/a&gt; &lt;br&gt;
&lt;em&gt;The client (&lt;code&gt;Kitchen&lt;/code&gt;) works with factories and products only through interfaces.&lt;/em&gt;  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Key Takeaways&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Ensures compatibility&lt;/strong&gt; – All objects belong to the same family&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Simplifies swapping&lt;/strong&gt; – Change entire themes by switching factories&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Follows Open/Closed&lt;/strong&gt; – Add new families without modifying code  &lt;/p&gt;

&lt;p&gt;Use Abstract Factory when you need &lt;strong&gt;coordinated object families&lt;/strong&gt; with clean separation of concerns!  &lt;/p&gt;

</description>
      <category>designpatterns</category>
      <category>tutorial</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Simplifying Design Patterns : Factory Method</title>
      <dc:creator>Bruno Caxias</dc:creator>
      <pubDate>Mon, 07 Apr 2025 19:57:40 +0000</pubDate>
      <link>https://forem.com/bccaxias/simplifying-design-patterns-factory-method-16f6</link>
      <guid>https://forem.com/bccaxias/simplifying-design-patterns-factory-method-16f6</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Design patterns are proven solutions to common software design problems. In this article, we’ll simplify the &lt;strong&gt;Factory Method&lt;/strong&gt; pattern—explaining how it works, when to use it, and how to implement it with clear examples. The examples are inspired by &lt;a href="https://refactoring.guru" rel="noopener noreferrer"&gt;Refactoring Guru&lt;/a&gt; and &lt;em&gt;Dive Into Design Patterns&lt;/em&gt; (Alexander Shvets), distilled to their essence.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;How Does the Factory Method Work?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Factory Method&lt;/strong&gt; is a &lt;strong&gt;creational&lt;/strong&gt; design pattern that provides an interface for creating objects in a superclass while allowing subclasses to alter the type of objects created.  &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Example Scenario: A Restaurant Kitchen&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Imagine a restaurant where:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;Kitchen&lt;/code&gt; class defines how dishes are made.
&lt;/li&gt;
&lt;li&gt;Each dish (e.g., &lt;code&gt;Pizza&lt;/code&gt;, &lt;code&gt;Burger&lt;/code&gt;, &lt;code&gt;Pasta&lt;/code&gt;) follows a common &lt;code&gt;Dish&lt;/code&gt; interface with methods like &lt;code&gt;prepare()&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Instead of hardcoding dish creation, the &lt;code&gt;Kitchen&lt;/code&gt; delegates instantiation to subclasses (&lt;code&gt;PizzaStation&lt;/code&gt;, &lt;code&gt;BurgerStation&lt;/code&gt;).
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This way, adding a new dish (e.g., &lt;code&gt;Taco&lt;/code&gt;) doesn’t require modifying the &lt;code&gt;Kitchen&lt;/code&gt;—just creating a new subclass.  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;When to Use the Factory Method?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use this pattern when:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;You don’t know object types beforehand&lt;/strong&gt; – The exact class of objects (e.g., dishes) isn’t known until runtime.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You want extensibility&lt;/strong&gt; – Users of your library/framework should be able to add new types (e.g., new dishes) without changing existing code.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You need object reuse&lt;/strong&gt; – Avoid rebuilding objects by caching and reusing them (e.g., reusing a preconfigured &lt;code&gt;Pizza&lt;/code&gt; object).
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;How to Implement the Factory Method&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Step-by-Step (Restaurant Example)&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define a Common Interface&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All dishes implement a &lt;code&gt;Dish&lt;/code&gt; interface with shared methods (e.g., &lt;code&gt;prepare()&lt;/code&gt;, &lt;code&gt;cook()&lt;/code&gt;).
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create the Base Factory (Kitchen)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;Kitchen&lt;/code&gt; class declares an &lt;strong&gt;abstract&lt;/strong&gt; (or default) factory method:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="nc"&gt;Dish&lt;/span&gt; &lt;span class="nf"&gt;createDish&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implement Factory Subclasses&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subclasses (&lt;code&gt;PizzaStation&lt;/code&gt;, &lt;code&gt;BurgerStation&lt;/code&gt;) override &lt;code&gt;createDish()&lt;/code&gt; to instantiate specific dishes:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PizzaStation&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Kitchen&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
     &lt;span class="nd"&gt;@Override&lt;/span&gt;  
     &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Dish&lt;/span&gt; &lt;span class="nf"&gt;createDish&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
         &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Pizza&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Pizza implements Dish  &lt;/span&gt;
     &lt;span class="o"&gt;}&lt;/span&gt;  
 &lt;span class="o"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Optional: Use Parameters for Variants&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If a dish has variations (e.g., &lt;code&gt;PastaType&lt;/code&gt;), pass a parameter to the factory method instead of creating more subclasses:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Dish&lt;/span&gt; &lt;span class="nf"&gt;createDish&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;pastaType&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Pasta&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pastaType&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  
 &lt;span class="o"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Make the Factory Method Abstract (If Needed)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the base factory method has no default logic, declare it &lt;code&gt;abstract&lt;/code&gt; to force subclasses to implement it.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Why Avoid Hardcoding?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;bad alternative&lt;/strong&gt; would be hardcoding every dish in the &lt;code&gt;Kitchen&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Hardcoded (inflexible)  &lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Kitchen&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Pizza&lt;/span&gt; &lt;span class="nf"&gt;makePizza&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Burger&lt;/span&gt; &lt;span class="nf"&gt;makeBurger&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  
    &lt;span class="c1"&gt;// Requires changes for every new dish!  &lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Problems:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Violates the &lt;strong&gt;Open/Closed Principle&lt;/strong&gt; (code isn’t open for extension).
&lt;/li&gt;
&lt;li&gt;Becomes bloated as new dishes are added.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Diagram&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6o186vu1rjgwi3lvxa9s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6o186vu1rjgwi3lvxa9s.png" alt="Factory Method Structure" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>designpatterns</category>
      <category>tutorial</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Levantando uma ASP.NET Web API em AWS ECS</title>
      <dc:creator>Bruno Caxias</dc:creator>
      <pubDate>Wed, 24 Apr 2024 17:10:11 +0000</pubDate>
      <link>https://forem.com/ledsifes/levantando-uma-aspnet-web-api-em-aws-ecs-2701</link>
      <guid>https://forem.com/ledsifes/levantando-uma-aspnet-web-api-em-aws-ecs-2701</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Este artigo tem como objetivo ensinar como é possível levantar uma imagem Docker de uma Web API em ASP.NET para AWS ECS utilizando o GitLab Container Registry e o AWS Academy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Antes de Começarmos
&lt;/h2&gt;

&lt;p&gt;Para poder utilizar o ECS da AWS, antes deve-se ter um registro de uma imagem Docker do seu projeto. Nesse caso, será utilizado como exemplo um registro no repositório do GitLab, mas também é possível utilizar outros registros como o do próprio Docker (DockerHub) ou o registro do ECR da AWS. Além disso, deve-se ter um cadastro na plataforma da AWS para uso das ferramentas. No caso deste artigo, será utilizado uma conta de estudante com acesso limitado a alguns módulos. Outro ponto a se considerar é a conexão da API com o banco de dados. No exemplo fornecido, a API está conectada a um banco levantado no próprio AWS por RDS, por meio de uma string de conexão no próprio código fonte.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Que é o ECS?
&lt;/h2&gt;

&lt;p&gt;De acordo com a &lt;a href="https://docs.aws.amazon.com/pt_br/AmazonECS/latest/developerguide/Welcome.html" rel="noopener noreferrer"&gt;documentação oficial da Amazon&lt;/a&gt;, o ECS é um serviço totalmente gerenciado de orquestração de contêineres que ajuda a implantar, gerenciar e dimensionar facilmente aplicações conteinerizadas. Sendo assim, esse serviço se encaixa perfeitamente para as necessidades desse artigo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Salvando a imagem Docker em um Registry
&lt;/h2&gt;

&lt;p&gt;Para esse exemplo será utilizado o Container Registry do GitLab para salvar e disponibilizar a imagem do Docker contendo o projeto.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Crie um repositório com o projeto que deseja dockerizar no GitLab.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ao criar o repositório, vá até &lt;strong&gt;Deploy -&amp;gt; Container Registry&lt;/strong&gt; na barra lateral.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F62npzzw9oxe8udl50cjw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F62npzzw9oxe8udl50cjw.png" alt="Container Registry" width="354" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Utilize os comandos mostrados na tela principal para realizar a publicação da imagem do Docker:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;docker login registry.gitlab.com&lt;/code&gt;&lt;br&gt;
&lt;code&gt;docker build -t [url do registro do projeto] .&lt;/code&gt;&lt;br&gt;
&lt;code&gt;docker push [url do registro do projeto]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Os comandos de build podem variar contendo outras tags dependendo do projeto, então é importante prestar atenção a esses cuidados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Levantando o ECS em AWS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Iniciando o Lab
&lt;/h3&gt;

&lt;p&gt;Para começar o levantamento do ECS, primeiro deve-se acessar o AWS Lab para ter acesso aos serviços.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0uyw5pwmeu8vpcs59as.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0uyw5pwmeu8vpcs59as.png" alt="Módulos" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clique em Start Lab, assim que o símbolo de AWS ficar verde clique nele.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmurgpu60o64fp8jvq8ee.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmurgpu60o64fp8jvq8ee.png" alt="Start Lab" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando o ECS
&lt;/h3&gt;

&lt;p&gt;Após isso, na aba de pesquisa coloca-se ECS para encontrar o serviço.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhm7g6mjwxomi3x7hs9ah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhm7g6mjwxomi3x7hs9ah.png" alt="Pesquisa ECS" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicando um ECS a seguinte tela deve aparecer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F72malg9bi2rmcvq2ggz3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F72malg9bi2rmcvq2ggz3.png" alt="Tela ECS" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Crie um cluster para o serviço seguindo os passos, nesse caso será criado um cluster AWS Fargate (Sem servidor):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Insira um nome para o cluster&lt;/li&gt;
&lt;li&gt;Selecione AWS Fargate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe75i4rr740mznmavwuwm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe75i4rr740mznmavwuwm.png" alt="Config ECS" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando tarefas para rodar no Cluster
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Acesse &lt;strong&gt;Definições da tarefa&lt;/strong&gt; na barra lateral.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftf2z9r3kq7fs7su42ge4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftf2z9r3kq7fs7su42ge4.png" alt="Definições da tarefa" width="291" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Clique em &lt;strong&gt;Criar nova definição de tarefa&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Defina um nome para a tarefa.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0naqqd0cn1sa15vo6od.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0naqqd0cn1sa15vo6od.png" alt="Nome para tarefa" width="800" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure os requisitos de infraestrutura, nesse caso será mantido o AWS Fargate no tipo de inicialização, o sistema operacional deve ser o sistema no qual o seu Docker irá rodar, o tamanho da tarefa deve ser definido a partir dos requisitos da sua Web API (Para APIs com muita computação é aconselhável alterar os valores).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs0j20ubwaebfzyavaowu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs0j20ubwaebfzyavaowu.png" alt="Config Infra Tarefa" width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em funções da tarefa é interessante que em &lt;strong&gt;Função de execução de tarefas&lt;/strong&gt; seja selecionado um perfil com as permissões necessárias para as ações da API, ou no caso de contas de estudante (como a utilizada), seja selecionada uma opção permitida. Nesse caso, será utilizado o perfil LabRole.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01hfgf30umy3wha1zdxx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01hfgf30umy3wha1zdxx.png" alt="Função de execução de tarefas" width="800" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agora será o momento de configurar o container para que rode no cluster.

&lt;ul&gt;
&lt;li&gt;Comece colocando um nome para o contêiner, o link para a imagem  do Docker no repositório, mantenha a opção de &lt;strong&gt;Contêiner Essencial&lt;/strong&gt; como &lt;strong&gt;Sim&lt;/strong&gt;, caso as imagens do repositório sejam privadas é necessário a configuração de um Secrets Manager no AWS para autenticação e acesso a imagem no repositório.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6wcfspriu5ytip6zy8s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6wcfspriu5ytip6zy8s.png" alt="Detalhes do contêiner" width="800" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso não saiba, para conseguir o link para a imagem no repositório você deve ir em &lt;strong&gt;Deploy -&amp;gt; Container Registry&lt;/strong&gt; após ter publicado a imagem e clicar no botão de copiar ao lado do nome da imagem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvl1siwc92o4q81rmpzfe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvl1siwc92o4q81rmpzfe.png" alt="Gitlab docker image link" width="315" height="129"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em mapeamento de porta coloque a porta em que a API estará respondendo, no exemplo será a porta 8080. Caso queira o protocolo da aplicação pode ser alterado também (por exemplo HTTP2 para HTTPS).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0c3buoojd02uhd261h5h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0c3buoojd02uhd261h5h.png" alt="Mapeamento de porta" width="800" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No caso do exemplo o resto das opções podem ser mantidas como padrão.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inserindo a tarefa no Cluster
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Acesse o Cluster e clique em Criar na aba de Tarefa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7thsymo6tzjwpgp0kb1j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7thsymo6tzjwpgp0kb1j.png" alt="Aba de Tarefa" width="800" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em &lt;strong&gt;Ambiente&lt;/strong&gt; selecione a opção &lt;strong&gt;Tipo de Inicialização&lt;/strong&gt; e mantenha em Fargate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx024uujrbz6j9g9f0156.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx024uujrbz6j9g9f0156.png" alt="Ambiente" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em &lt;strong&gt;Configuração de Implantação&lt;/strong&gt; selecione &lt;strong&gt;Serviço&lt;/strong&gt;. No caso da Web API, selecione a família da tarefa criada para o cluster, atribua um nome, mantenha o tipo de serviço no padrão e coloque quantas tarefas irão ser inicializadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnz1u3zu1calysgeqsiv0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnz1u3zu1calysgeqsiv0.png" alt="Configuração de Implantação" width="800" height="637"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso, para esse exemplo pode-se manter o resto em padrão e clicar em Criar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Acessar a API Web por IP Público
&lt;/h2&gt;

&lt;p&gt;Depois de criado o serviço no cluster basta acessar o cluster e na aba services selecionar o serviço criado.&lt;/p&gt;

&lt;p&gt;Na tela do serviço clique em Tarefas e clique na Tarefa do serviço.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ggs2lcl8852fxhrkc6x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ggs2lcl8852fxhrkc6x.png" alt="Tarefa do serviço" width="800" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao clicar na tarefa, na aba de &lt;strong&gt;Configuração&lt;/strong&gt; será possível ver uma aba com o &lt;strong&gt;IP Público&lt;/strong&gt;, por meio desse IP será possível acessar a API externamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyrf1af2xbf7dh3to7p49.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyrf1af2xbf7dh3to7p49.png" alt="IP Público" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lembre-se de colocar a porta que deve ser acessada, assim como os caminhos próprios da API na URL para verificar funcionalidade.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsbuivtl4votomxg8new.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsbuivtl4votomxg8new.png" alt="URL API" width="616" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Dessa forma, por meio desse artigo temos ao fim uma ASP.NET Web API Dockerizada rodando em ECS AWS. Essa publicação teve em mente detalhar e exemplificar melhor o processo de criação desse serviço utilizando imagens dos módulos. Por fim, é importante incentivar a leitura da documentação oficial do AWS assim como a busca por outros fóruns capazes de sanar dúvidas e questões relacionadas a passos específicos não elaborados suficientemente aqui.&lt;/p&gt;

</description>
      <category>ledscommunity</category>
      <category>tutorial</category>
      <category>aws</category>
      <category>aspnet</category>
    </item>
    <item>
      <title>Levantando um SQL Server RDS em AWS</title>
      <dc:creator>Bruno Caxias</dc:creator>
      <pubDate>Wed, 24 Apr 2024 15:56:14 +0000</pubDate>
      <link>https://forem.com/ledsifes/levantando-um-sql-server-rds-em-aws-31fe</link>
      <guid>https://forem.com/ledsifes/levantando-um-sql-server-rds-em-aws-31fe</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Este artigo tem como objetivo ensinar como é possível levantar um SQL Server em RDS por meio do AWS Academy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Antes de Começarmos
&lt;/h2&gt;

&lt;p&gt;Para poder utilizar o RDS do AWS, deve-se ter um cadastro na plataforma da AWS para uso das ferramentas. No caso deste artigo, será utilizado uma conta de estudante com acesso limitado a alguns módulos.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Que é o RDS?
&lt;/h2&gt;

&lt;p&gt;De acordo com a &lt;a href="https://docs.aws.amazon.com/pt_br/AmazonRDS/latest/UserGuide/Welcome.html" rel="noopener noreferrer"&gt;documentação oficial da Amazon&lt;/a&gt;, o Amazon Relational Database Service (Amazon RDS) é um serviço da Web que facilita a configuração, operação e escalabilidade de um banco de dados relacional na Nuvem AWS. Ele fornece capacidade econômica e redimensionável para um banco de dados relacional padrão do setor e gerencia tarefas comuns de administração de banco de dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Levantando o RDS na AWS
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Iniciando o Lab
&lt;/h4&gt;

&lt;p&gt;Para começar o levantamento do ECS, primeiro deve-se acessar o AWS Lab para ter acesso aos serviços.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0uyw5pwmeu8vpcs59as.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0uyw5pwmeu8vpcs59as.png" alt="Módulos" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clique em "Start Lab". Assim que o símbolo da AWS ficar verde, clique nele.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmurgpu60o64fp8jvq8ee.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmurgpu60o64fp8jvq8ee.png" alt="Start Lab" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Criando o RDS
&lt;/h4&gt;

&lt;p&gt;Após isso, na aba de pesquisa, coloca-se "RDS" para encontrar o serviço.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx918ftew75tnz38g0467.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx918ftew75tnz38g0467.png" alt="Pesquisa por RDS" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clique em RDS e acesse a opção de &lt;strong&gt;Instâncias de banco de dados&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh5b523ljif72lkgge9pm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh5b523ljif72lkgge9pm.png" alt="Clique em RDS" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clique em &lt;strong&gt;Criar Banco de Dados&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Na tela de criação, na aba de &lt;strong&gt;Escolher um método de criação de banco de dados&lt;/strong&gt;, devido às limitações da conta utilizada, a opção de &lt;strong&gt;Criação Fácil&lt;/strong&gt; é indisponível.&lt;/p&gt;

&lt;p&gt;Em &lt;strong&gt;Opções de Mecanismo&lt;/strong&gt;, selecione &lt;strong&gt;Microsoft SQL Server&lt;/strong&gt; e escolha a versão que deseja utilizar para o banco. No caso do exemplo, a versão será a seguinte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F940trkwmvi67qdc1er36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F940trkwmvi67qdc1er36.png" alt="Opções de Mecanismo" width="722" height="541"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em modelos, escolha qual a fase do projeto que deseja utilizar. Para o exemplo, será utilizado a versão gratuita.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv2oym50fdn51jtjhjhzh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv2oym50fdn51jtjhjhzh.png" alt="Modelos de banco de dados" width="733" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na aba de configurações, defina o nome, usuário e senha do banco.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdvrw1mbhzp6mt6tj5ami.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdvrw1mbhzp6mt6tj5ami.png" alt="Configurações do banco de dados" width="721" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As senhas podem ser salvas em AWS Secret Manager, mas aqui será utilizado um Autogerenciado.&lt;/p&gt;

&lt;p&gt;Para o resto das configurações, pode-se manter em padrão.&lt;/p&gt;

&lt;p&gt;Caso queira acessar seu banco externamente, é necessário fazer alterações nas configurações de &lt;strong&gt;Conectividade&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmzmyjhgvtj5jcghq595.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmzmyjhgvtj5jcghq595.png" alt="Conectividade" width="718" height="858"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nas opções, é possível vincular o banco a uma instância EC2 já existente no AWS e também é possível ativar o &lt;strong&gt;Acesso Público&lt;/strong&gt; ao banco.&lt;/p&gt;

&lt;p&gt;Após isso, pode-se criar o banco de dados e esperar o mesmo subir ao ar.&lt;/p&gt;

&lt;h4&gt;
  
  
  Mudando regras de acesso para o banco
&lt;/h4&gt;

&lt;p&gt;Na tela de detalhes do banco, podemos ver várias informações sobre o mesmo. Em &lt;strong&gt;Connectivity &amp;amp; security&lt;/strong&gt;, encontramos o endpoint que será a URL de acesso para o banco.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm3tjq6eldpfnn64ypu0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm3tjq6eldpfnn64ypu0e.png" alt="Connectivity &amp;amp; security" width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para mudar as regras para o acesso público ao banco, é necessário acessar o firewall responsável pelo mesmo. Para isso, deve-se acessar o &lt;strong&gt;VPC&lt;/strong&gt; na área de &lt;strong&gt;Security&lt;/strong&gt; dentro de &lt;strong&gt;Connectivity &amp;amp; security&lt;/strong&gt; e clicar no link do mesmo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fioji2y849xv42f18f0jg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fioji2y849xv42f18f0jg.png" alt="Security" width="387" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao ser redirecionado para a página de &lt;strong&gt;Security Groups&lt;/strong&gt;, deve-se acessar o security group responsável pelo banco de dados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5taaxstz1di8f1vrjglt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5taaxstz1di8f1vrjglt.png" alt="Security Group" width="800" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao acessar o security group responsável pelo banco, pode-se ver a aba de &lt;strong&gt;Inbound rules&lt;/strong&gt; e nela estarão presentes todas as regras de acesso ao banco de dados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77p6wzji1o3qpmkff6ai.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77p6wzji1o3qpmkff6ai.png" alt="Inbound rules" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para criar uma nova regra, basta clicar em &lt;strong&gt;Edit Inbound Rules&lt;/strong&gt; e, na tela que aparecer, criar a nova regra.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2iwh2u6qi8dsdw8l9si4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2iwh2u6qi8dsdw8l9si4.png" alt="Edit Inbound Rules" width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A seguinte regra permite que qualquer IP acesse o banco, sendo necessário apenas o uso do usuário e da senha (se foram criados).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjs91q4c9gf53aowwkxpd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjs91q4c9gf53aowwkxpd.png" alt="Qualquer IP acessar o banco" width="800" height="55"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Dessa forma, conclui-se o tutorial com passo-a-passo e imagens para compreensão de como criar um banco de dados RDS na AWS, visando sanar possíveis dúvidas e falta de entendimento do processo. Juntamente com este documento, recomenda-se o estudo aprofundado das ferramentas do AWS, assim como a busca por outros fóruns capazes de detalhar passos não elaborados.&lt;/p&gt;

</description>
      <category>ledscommunity</category>
      <category>aws</category>
      <category>database</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Explorando o AppSmith com uma REST API</title>
      <dc:creator>Bruno Caxias</dc:creator>
      <pubDate>Mon, 05 Feb 2024 11:33:29 +0000</pubDate>
      <link>https://forem.com/ledsifes/explorando-o-appsmith-com-uma-rest-api-1pc6</link>
      <guid>https://forem.com/ledsifes/explorando-o-appsmith-com-uma-rest-api-1pc6</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Este artigo tem o objetivo de detalhar algumas partes da manipulação de componentes do AppSmith que fazem uso de uma REST API e de JS, proporcionando um melhor entendimento dessas funcionalidades. Embora a ferramenta AppSmith já esteja bem documentada no &lt;a href="https://docs.appsmith.com/" rel="noopener noreferrer"&gt;site oficial&lt;/a&gt;, é possível identificar algumas lacunas e pontos que não foram suficientemente detalhados. Assim, este documento surge como uma maneira de preencher essas lacunas.&lt;br&gt;
Além disso, é pressuposto que uma API (pronta e funcional) será utilizada no projeto, sendo este o foco principal.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Criando Um Novo Projeto
&lt;/h3&gt;

&lt;p&gt;Criar um novo projeto é relativamente simples, apenas clicando no botão&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2kqq80lc2e5sefcx40q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2kqq80lc2e5sefcx40q.png" alt="Image description" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um projeto pode ser importado também, caso você já possua alguma parte pronta de outro projeto AppSmith.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Utilizando APIs
&lt;/h3&gt;

&lt;h5&gt;
  
  
  2.1. Configurando DataSource
&lt;/h5&gt;

&lt;p&gt;Antes de realizarmos as queries da API devemos configurar o DataSource nas opções do AppSmith.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fasg2gxjpt93izy32j705.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fasg2gxjpt93izy32j705.png" alt="Configurando DataSource" width="491" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selecione para criar um novo DataSource e selecione RestAPI para utilizar uma API já criada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkskl1277i27e9cff8wvh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkskl1277i27e9cff8wvh.png" alt="Configurando DataSource 2" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A tela que aparecerá será uma de geração de query:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxtulp5w2a2geyl07hyt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxtulp5w2a2geyl07hyt.png" alt="Geração de query" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso queira somente realizar uma query em uma API pública basta inserir o link no campo de url, mas caso queira salvar um DataSource que será utilizado constantemente durante o projeto siga os seguintes passos:&lt;/p&gt;

&lt;p&gt;Selecione a opção de Authentication&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9seytijjo95s00m2tq76.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9seytijjo95s00m2tq76.png" alt="Image description" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E após selecione o botão central de ‘Save as DataSource’&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0saucchj9w5buwypf5k9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0saucchj9w5buwypf5k9.png" alt="Image description" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na tela de datasource preencha os dados necessários para a API. A URL inserida deve ser a URL base da API e não a da query que deseja ser feita (ex. uma query &lt;a href="http://localhost:1337/api/pessoas" rel="noopener noreferrer"&gt;http://localhost:1337/api/pessoas&lt;/a&gt; tem como o endereço base da API  &lt;a href="http://localhost:1337/" rel="noopener noreferrer"&gt;http://localhost:1337/&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Se a API necessitar de algum tipo de autenticação, essa mesma pode ser realizada pela última opção de Authentication. &lt;/p&gt;

&lt;p&gt;No caso do uso conjunto com o Strapi é necessário uma autenticação por ‘Bearer Token’, ao selecionar essa opção uma nova caixa de texto aparecerá para inserir o token de autenticação do Strapi (para adquirir esse token verifique a documentação do Strapi)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0702ihvpyzftirauak1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0702ihvpyzftirauak1.png" alt="Image description" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após salvar o DataSource é possível realizar queries de forma mais simples, inserindo somente as rotas de navegação e mantendo a URL base, como no exemplo abaixo utilizando a rota ‘/api/pessoas/’&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5warkassyvlo7dq5s9z2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5warkassyvlo7dq5s9z2.png" alt="Image description" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  2.2. Utilizando APIs em Componentes
&lt;/h5&gt;

&lt;p&gt;Ao se criar um componente como uma tabela é demonstrada a opção de conexão para obtenção de dados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsudsw7ktabtlk4e8f6bf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsudsw7ktabtlk4e8f6bf.png" alt="Image description" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao clicar no botão tem-se novamente a opção de realizar uma query, mas desta vez será utilizado como base o DataSource já cadastrado anteriormente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8tetr08c4qknpmyrn8ah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8tetr08c4qknpmyrn8ah.png" alt="Image description" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A tela de início não possuirá nada na URL, mas ao clicar no DataSource salvo na aba de Datasources o campo irá se auto preencher com a URL base e com isso basta complementar com a rota desejada.&lt;br&gt;
A partir disto é possível testar a resposta da API clicando em ‘RUN’ e vendo o resultado da query.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzxukcp9nl0augqfdhty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzxukcp9nl0augqfdhty.png" alt="Image description" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  2.3. Utilizando APIs sem Componentes
&lt;/h5&gt;

&lt;p&gt;Queries também podem ser realizadas sem estarem vinculadas a um componente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji0cdd1srteewvh3tgju.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fji0cdd1srteewvh3tgju.png" alt="Image description" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selecionando a opção ‘Explorer’ no menu lateral e clicando no simbolo ‘+’ ao lado de ‘Queries/JS’ é possível criar uma query sem estar vinculada a um componente.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Utilizando componentes
&lt;/h3&gt;

&lt;h5&gt;
  
  
  3.1. Tabelas
&lt;/h5&gt;

&lt;p&gt;Ao se criar uma tabela e um datasource for escolhido a tabela gerará uma coluna para cada tipo de dado fornecido.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pnq8wj70dxi7zfy89bi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pnq8wj70dxi7zfy89bi.png" alt="Image description" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por meio das configurações presentes no menu lateral direito é possível definir o datasource e realizar configurações individuais para cada coluna, não só mudando a visibilidade das mesmas mas também a formatação dos dados presentes em cada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqn7z19zkouktet8twmqk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqn7z19zkouktet8twmqk.png" alt="Image description" width="351" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Além das colunas geradas pelo datasource é possível também serem criadas colunas extras com nomes, símbolos e opções configuráveis, como as colunas de ‘Apagar’ e ‘Mais Detalhes’ presentes no exemplo.&lt;/p&gt;

&lt;h5&gt;
  
  
  3.2. Dropdowns
&lt;/h5&gt;

&lt;p&gt;O menu dropdown ao ser adicionado já possui um dataset básico de exemplo. Sendo assim, deve-se altera-lo caso seja desejado utilizar dados do Datasource.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvp049kuplj9xrb2xie6u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvp049kuplj9xrb2xie6u.png" alt="Image description" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É importante sempre definir a ‘Label Key’ e a ‘Value Key’ de forma correta, sendo a ‘Label Key’ o campo que será utilizado para aparecer na listagem do dropdown e o ‘Value Key’ o valor do campo (ex. O objeto coordenador pode ter o nome ‘Bruno’ e o id ‘1’ e ao enviar a informação desse objeto esse id deve ser passado então ‘Bruno’ seria o ‘Label Key’ e o id seria o ‘Value Key’)&lt;/p&gt;

&lt;h5&gt;
  
  
  3.3. Date Pickers
&lt;/h5&gt;

&lt;p&gt;O date picker não necessita de muitas alterações mas é importante verificar se o formato de data que é enviado é similar ao requisitado pela API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjwp3ugzhkfyriefyrzy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjwp3ugzhkfyriefyrzy.png" alt="Image description" width="360" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O date format deve estar de acordo com o formato utilizado pela API (ex. Se a API requisitar a data em formato yyyy/mm/dd o date picker deve também ser configurado para este date format)&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Redirecionando telas com informações
&lt;/h3&gt;

&lt;p&gt;Ao selecionar um botão é possível atribuir ao mesmo um ação onClick.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69ph8ra6kc7jg9z3g9js.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69ph8ra6kc7jg9z3g9js.png" alt="Image description" width="729" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para que seja feito um botão de redirecionamento deve ser utilizada a opção ‘Navigate To’, ao seleciona-la é possível ser enviado um parâmetro pela query na aba de ‘Query params’. Utilizando variáveis já presentes no AppSmith é possível por exemplo no caso de uma tabela enviar o id da linha selecionada, nesse caso o id do &lt;br&gt;
objeto que foi selecionado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmxxf6fbfsf282tqg90c1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmxxf6fbfsf282tqg90c1.png" alt="Image description" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então em outra tela esse parâmetro enviado, nesse caso o id, pode ser utilizado para            realizar uma nova query como no exemplo acima utilizando a variável ‘appsmith.URL.queryParams.key’ para resgatar a key enviada.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Usando JS
&lt;/h3&gt;

&lt;p&gt;O uso de javascript também é possível no AppSmith, sendo que a criação de um script ocorre na mesma aba de criação de queries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcm7nh88kx2b0y1rcxs9m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcm7nh88kx2b0y1rcxs9m.png" alt="Image description" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dessa forma, esses scripts podem ser atribuídos a diversos componentes, como no exemplo abaixo ao ser utilizado para calcular horas de trabalho.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5weugdjibiqnbs868gtt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5weugdjibiqnbs868gtt.png" alt="Image description" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Em resumo, este documento procurou oferecer assistência na configuração do DataSource e na utilização dos componentes, como tabela, dropdown e date picker, disponibilizados pelo AppSmith. Foram fornecidos insights sobre a configuração e a aplicação adequada desses elementos, incluindo detalhes sobre a configuração de queries e o uso de JS para personalizar campos de componentes. Recomenda-se a exploração da documentação oficial e de outros documentos complementares para uma compreensão mais aprofundada e para atender às demandas específicas de projetos. A combinação do AppSmith com APIs representa uma ferramenta robusta para o desenvolvimento ágil e eficaz de aplicativos.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>ledscommunity</category>
      <category>appsmith</category>
    </item>
  </channel>
</rss>
