<?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>DEV Community: Subhrodip Mohanta</title>
    <description>The latest articles on DEV Community by Subhrodip Mohanta (@ohbus).</description>
    <link>https://dev.to/ohbus</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%2F390012%2F6524c5c8-dcae-4f33-97ec-900e2b7bcbe6.jpeg</url>
      <title>DEV Community: Subhrodip Mohanta</title>
      <link>https://dev.to/ohbus</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ohbus"/>
    <language>en</language>
    <item>
      <title>Abstract Factory Design Pattern</title>
      <dc:creator>Subhrodip Mohanta</dc:creator>
      <pubDate>Thu, 27 May 2021 09:14:37 +0000</pubDate>
      <link>https://dev.to/ohbus/abstract-factory-design-pattern-2ajb</link>
      <guid>https://dev.to/ohbus/abstract-factory-design-pattern-2ajb</guid>
      <description>&lt;p&gt;This is a &lt;strong&gt;Creational&lt;/strong&gt; Design Pattern under &lt;strong&gt;Gang of Four&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Also known as
&lt;/h2&gt;

&lt;p&gt;Kit&lt;/p&gt;

&lt;h2&gt;
  
  
  Intent
&lt;/h2&gt;

&lt;p&gt;Provide an interface for creating families of related or dependent&lt;br&gt;
objects without specifying their concrete classes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Explanation
&lt;/h2&gt;

&lt;p&gt;Real world example&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To create a kingdom we need objects with a common theme. Elven kingdom needs an Elven king, Elven castle and Elven army whereas Orcish kingdom needs an Orcish king, Orcish castle and Orcish army. There is a dependency between the objects in the kingdom.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In plain words&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A factory of factories; a factory that groups the individual but related/dependent factories together without specifying their concrete classes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wikipedia says&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Programmatic Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Translating the kingdom example above. First of all we have some interfaces and implementation for the objects in the &lt;br&gt;
kingdom.&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Castle&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getDescription&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="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;King&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getDescription&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="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Army&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getDescription&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Elven implementations -&amp;gt;&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;ElfCastle&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Castle&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;DESCRIPTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"This is the Elven castle!"&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;String&lt;/span&gt; &lt;span class="nf"&gt;getDescription&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="no"&gt;DESCRIPTION&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ElfKing&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;King&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;DESCRIPTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"This is the Elven king!"&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;String&lt;/span&gt; &lt;span class="nf"&gt;getDescription&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="no"&gt;DESCRIPTION&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ElfArmy&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Army&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;DESCRIPTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"This is the Elven Army!"&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;String&lt;/span&gt; &lt;span class="nf"&gt;getDescription&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="no"&gt;DESCRIPTION&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;// Orcish implementations similarly -&amp;gt; ...&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we have the abstraction and implementations for the kingdom factory&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;KingdomFactory&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;Castle&lt;/span&gt; &lt;span class="nf"&gt;createCastle&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="nc"&gt;King&lt;/span&gt; &lt;span class="nf"&gt;createKing&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="nc"&gt;Army&lt;/span&gt; &lt;span class="nf"&gt;createArmy&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ElfKingdomFactory&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;KingdomFactory&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;Castle&lt;/span&gt; &lt;span class="nf"&gt;createCastle&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;ElfCastle&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;King&lt;/span&gt; &lt;span class="nf"&gt;createKing&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;ElfKing&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;Army&lt;/span&gt; &lt;span class="nf"&gt;createArmy&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;ElfArmy&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrcKingdomFactory&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;KingdomFactory&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;Castle&lt;/span&gt; &lt;span class="nf"&gt;createCastle&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;OrcCastle&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;King&lt;/span&gt; &lt;span class="nf"&gt;createKing&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;OrcKing&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;Army&lt;/span&gt; &lt;span class="nf"&gt;createArmy&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;OrcArmy&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;Now we have our abstract factory that lets us make family of related objects i.e. Elven kingdom factory creates Elven castle, king and army etc.&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;factory&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;ElfKingdomFactory&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;castle&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;createCastle&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;king&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;createKing&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;army&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;createArmy&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;castle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDescription&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;king&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDescription&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;army&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDescription&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Program output:&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="nc"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nc"&gt;Elven&lt;/span&gt; &lt;span class="n"&gt;castle&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="nc"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nc"&gt;Elven&lt;/span&gt; &lt;span class="n"&gt;king&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="nc"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nc"&gt;Elven&lt;/span&gt; &lt;span class="nc"&gt;Army&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we can design a factory for our different kingdom factories. In this example, we created FactoryMaker, responsible for returning an instance of either ElfKingdomFactory or OrcKingdomFactory.&lt;br&gt;&lt;br&gt;
The client can use FactoryMaker to create the desired concrete factory which, in turn, will produce different concrete objects (Army, King, Castle).&lt;br&gt;&lt;br&gt;
In this example, we also used an enum to parameterize which type of kingdom factory the client will ask for.&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FactoryMaker&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="nc"&gt;KingdomType&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="no"&gt;ELF&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;ORC&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;KingdomFactory&lt;/span&gt; &lt;span class="nf"&gt;makeFactory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;KingdomType&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&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="nl"&gt;ELF:&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;ElfKingdomFactory&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;ORC:&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;OrcKingdomFactory&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"KingdomType not supported."&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="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&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;App&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

  &lt;span class="no"&gt;LOGGER&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Elf Kingdom"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createKingdom&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FactoryMaker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;makeFactory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;KingdomType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ELF&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
  &lt;span class="no"&gt;LOGGER&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getArmy&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getDescription&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
  &lt;span class="no"&gt;LOGGER&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCastle&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getDescription&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
  &lt;span class="no"&gt;LOGGER&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKing&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getDescription&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

  &lt;span class="no"&gt;LOGGER&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Orc Kingdom"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createKingdom&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FactoryMaker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;makeFactory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;KingdomType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ORC&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
  &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;similar&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;orc&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Class diagram
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NYhmskkl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qhlfphywv727trl5zcfk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NYhmskkl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qhlfphywv727trl5zcfk.png" alt="alt text" title="Abstract Factory class diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Applicability
&lt;/h2&gt;

&lt;p&gt;Use the Abstract Factory pattern when&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The system should be independent of how its products are created, composed and represented&lt;/li&gt;
&lt;li&gt;The system should be configured with one of multiple families of products&lt;/li&gt;
&lt;li&gt;The family of related product objects is designed to be used together, and you need to enforce this constraint&lt;/li&gt;
&lt;li&gt;You want to provide a class library of products, and you want to reveal just their interfaces, not their implementations&lt;/li&gt;
&lt;li&gt;The lifetime of the dependency is conceptually shorter than the lifetime of the consumer.&lt;/li&gt;
&lt;li&gt;You need a run-time value to construct a particular dependency&lt;/li&gt;
&lt;li&gt;You want to decide which product to call from a family at runtime.&lt;/li&gt;
&lt;li&gt;You need to supply one or more parameters only known at run-time before you can resolve a dependency.&lt;/li&gt;
&lt;li&gt;When you need consistency among products&lt;/li&gt;
&lt;li&gt;You don’t want to change existing code when adding new products or families of products to the program.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example use cases   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selecting to call to the appropriate implementation of FileSystemAcmeService or DatabaseAcmeService or NetworkAcmeService at runtime.&lt;/li&gt;
&lt;li&gt;Unit test case writing becomes much easier&lt;/li&gt;
&lt;li&gt;UI tools for different OS&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Consequences:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Dependency injection in java hides the service class dependencies that can lead to runtime errors that would have been caught at compile time.&lt;/li&gt;
&lt;li&gt;While the pattern is great when creating predefined objects, adding the new ones might be challenging.&lt;/li&gt;
&lt;li&gt;The code becomes more complicated than it should be, since a lot of new interfaces and classes are introduced along with the pattern.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tutorial
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.journaldev.com/1418/abstract-factory-design-pattern-in-java"&gt;Abstract Factory Pattern Tutorial&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Known uses
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilderFactory.html"&gt;javax.xml.parsers.DocumentBuilderFactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newInstance--"&gt;javax.xml.transform.TransformerFactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.oracle.com/javase/8/docs/api/javax/xml/xpath/XPathFactory.html#newInstance--"&gt;javax.xml.xpath.XPathFactory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Related patterns
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.subho.xyz/posts/factory-method-design-pattern-2c94/"&gt;Factory Method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://java-design-patterns.com/patterns/factory-kit/"&gt;Factory Kit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0201633612&amp;amp;linkCode=as2&amp;amp;tag=javadesignpat-20&amp;amp;linkId=675d49790ce11db99d90bde47f1aeb59"&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596007124&amp;amp;linkCode=as2&amp;amp;tag=javadesignpat-20&amp;amp;linkId=6b8b6eea86021af6c8e3cd3fc382cb5b"&gt;Head First Design Patterns: A Brain-Friendly Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Code can be found &lt;a href="https://github.com/iluwatar/java-design-patterns/tree/master/abstract-factory"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Find out about more design patterns from &lt;a href="https://dev.to/ohbus/series/12844"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Credit to Original Authors of this post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/iluwatar"&gt;Ilkka Seppälä&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sankypanhale"&gt;Sanket Panhale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tschis"&gt;Rodolfo Forte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Deathnerd"&gt;Wes Gilleland&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/slawiko"&gt;Sviataslau Shchaurouski&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/prafful1"&gt;Prafful Agarwal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JackieNim"&gt;JackieNim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/npathai"&gt;Narendra Pathai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dignat"&gt;Denise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anuragagarwal561994"&gt;Anurag Agarwal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
      <category>programming</category>
      <category>java</category>
      <category>software</category>
      <category>principles</category>
    </item>
    <item>
      <title>Factory Method Design Pattern</title>
      <dc:creator>Subhrodip Mohanta</dc:creator>
      <pubDate>Sun, 23 May 2021 10:15:53 +0000</pubDate>
      <link>https://dev.to/ohbus/factory-method-design-pattern-2c94</link>
      <guid>https://dev.to/ohbus/factory-method-design-pattern-2c94</guid>
      <description>&lt;p&gt;This is a &lt;strong&gt;Creational&lt;/strong&gt; Design Pattern under &lt;strong&gt;Gang of Four&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Also known as
&lt;/h2&gt;

&lt;p&gt;Virtual Constructor&lt;/p&gt;

&lt;h2&gt;
  
  
  Intent
&lt;/h2&gt;

&lt;p&gt;Define an interface for creating an object, but let subclasses decide which class to instantiate. &lt;br&gt;
Factory Method lets a class defer instantiation to subclasses.&lt;/p&gt;
&lt;h2&gt;
  
  
  Explanation
&lt;/h2&gt;

&lt;p&gt;Real world example&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Blacksmith manufactures weapons. Elves require Elvish weapons and orcs require Orcish weapons. &lt;br&gt;
Depending on the customer at hand the right type of blacksmith is summoned.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In plain words&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It provides a way to delegate the instantiation logic to child classes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wikipedia says&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In class-based programming, the factory method pattern is a creational pattern that uses factory &lt;br&gt;
methods to deal with the problem of creating objects without having to specify the exact class of &lt;br&gt;
the object that will be created. This is done by creating objects by calling a factory method &lt;br&gt;
— either specified in an interface and implemented by child classes, or implemented in a base &lt;br&gt;
class and optionally overridden by derived classes—rather than by calling a constructor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Programmatic Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Taking our blacksmith example above. First of all we have a &lt;code&gt;Blacksmith&lt;/code&gt; interface and some &lt;br&gt;
implementations for it:&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Blacksmith&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;Weapon&lt;/span&gt; &lt;span class="nf"&gt;manufactureWeapon&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;WeaponType&lt;/span&gt; &lt;span class="n"&gt;weaponType&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ElfBlacksmith&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Blacksmith&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;Weapon&lt;/span&gt; &lt;span class="nf"&gt;manufactureWeapon&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;WeaponType&lt;/span&gt; &lt;span class="n"&gt;weaponType&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="no"&gt;ELFARSENAL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;weaponType&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrcBlacksmith&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Blacksmith&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;Weapon&lt;/span&gt; &lt;span class="nf"&gt;manufactureWeapon&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;WeaponType&lt;/span&gt; &lt;span class="n"&gt;weaponType&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="no"&gt;ORCARSENAL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;weaponType&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;When the customers come, the correct type of blacksmith is summoned and requested weapons are &lt;br&gt;
manufactured:&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;blacksmith&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;ElfBlacksmith&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;blacksmith&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;manufactureWeapon&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;WeaponType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SPEAR&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;blacksmith&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;manufactureWeapon&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;WeaponType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;AXE&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Program output:&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;// Elven spear&lt;/span&gt;
&lt;span class="c1"&gt;// Elven axe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Class diagram
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.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%2F43rjfjyochyd9srtyff8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F43rjfjyochyd9srtyff8.png" title="Factory Method pattern class diagram" alt="alt text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Applicability
&lt;/h2&gt;

&lt;p&gt;Use the Factory Method pattern when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Class cannot anticipate the class of objects it must create.&lt;/li&gt;
&lt;li&gt;Class wants its subclasses to specify the objects it creates.&lt;/li&gt;
&lt;li&gt;Classes delegate responsibility to one of several helper subclasses, and you want to localize the 
knowledge of which helper subclass is the delegate.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real world examples
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#getInstance--" rel="noopener noreferrer"&gt;java.util.Calendar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html#getBundle-java.lang.String-" rel="noopener noreferrer"&gt;java.util.ResourceBundle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.oracle.com/javase/8/docs/api/java/text/NumberFormat.html#getInstance--" rel="noopener noreferrer"&gt;java.text.NumberFormat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html#forName-java.lang.String-" rel="noopener noreferrer"&gt;java.nio.charset.Charset&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.oracle.com/javase/8/docs/api/java/net/URLStreamHandlerFactory.html#createURLStreamHandler-java.lang.String-" rel="noopener noreferrer"&gt;java.net.URLStreamHandlerFactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html#of-E-" rel="noopener noreferrer"&gt;java.util.EnumSet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBContext.html#createMarshaller--" rel="noopener noreferrer"&gt;javax.xml.bind.JAXBContext&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0201633612&amp;amp;linkCode=as2&amp;amp;tag=javadesignpat-20&amp;amp;linkId=675d49790ce11db99d90bde47f1aeb59" rel="noopener noreferrer"&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596007124&amp;amp;linkCode=as2&amp;amp;tag=javadesignpat-20&amp;amp;linkId=6b8b6eea86021af6c8e3cd3fc382cb5b" rel="noopener noreferrer"&gt;Head First Design Patterns: A Brain-Friendly Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321213351&amp;amp;linkCode=as2&amp;amp;tag=javadesignpat-20&amp;amp;linkId=2a76fcb387234bc71b1c61150b3cc3a7" rel="noopener noreferrer"&gt;Refactoring to Patterns&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Code can be found &lt;a href="https://github.com/iluwatar/java-design-patterns/tree/master/factory-method" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Find out about more design patterns from &lt;a href="https://dev.to/ohbus/series/12844"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Credit to Original Authors of this post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/iluwatar" rel="noopener noreferrer"&gt;Ilkka Seppälä&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tschis" rel="noopener noreferrer"&gt;Rodolfo Forte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Deathnerd" rel="noopener noreferrer"&gt;Wes Gilleland&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/slawiko" rel="noopener noreferrer"&gt;Sviataslau Shchaurouski&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JackieNim" rel="noopener noreferrer"&gt;JackieNim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/npathai" rel="noopener noreferrer"&gt;Narendra Pathai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hbothra15" rel="noopener noreferrer"&gt;Hemant Bothra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anuragagarwal561994" rel="noopener noreferrer"&gt;Anurag Agarwal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
      <category>designpatterns</category>
      <category>java</category>
      <category>gangoffour</category>
      <category>creational</category>
    </item>
    <item>
      <title>Factory Design Pattern</title>
      <dc:creator>Subhrodip Mohanta</dc:creator>
      <pubDate>Fri, 21 May 2021 15:01:38 +0000</pubDate>
      <link>https://dev.to/ohbus/factory-design-pattern-25ki</link>
      <guid>https://dev.to/ohbus/factory-design-pattern-25ki</guid>
      <description>&lt;p&gt;This is a &lt;strong&gt;Creational&lt;/strong&gt; Design Pattern under &lt;strong&gt;Gang of Four&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Also known as
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Simple Factory&lt;/li&gt;
&lt;li&gt;Static Factory Method&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Intent
&lt;/h2&gt;

&lt;p&gt;Providing a static method encapsulated in a class called factory, in order to hide the &lt;br&gt;
implementation logic and makes client code focus on usage rather then initialization new objects.&lt;/p&gt;
&lt;h2&gt;
  
  
  Explanation
&lt;/h2&gt;

&lt;p&gt;Real world example&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Lets say we have a web application connected to SQLServer, but now we want to switch to Oracle. To &lt;br&gt;
do so without modifying existing source code, we need to implements Simple Factory pattern, in &lt;br&gt;
which a static method can be invoked to create connection to a given database.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wikipedia says&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Factory is an object for creating other objects – formally a factory is a function or method that &lt;br&gt;
returns objects of a varying prototype or class.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Programmatic Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We have an interface &lt;code&gt;Car&lt;/code&gt; and two implementations &lt;code&gt;Ford&lt;/code&gt; and &lt;code&gt;Ferrari&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getDescription&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Ford&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;DESCRIPTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"This is Ford."&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;String&lt;/span&gt; &lt;span class="nf"&gt;getDescription&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="no"&gt;DESCRIPTION&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Ferrari&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;DESCRIPTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"This is Ferrari."&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;String&lt;/span&gt; &lt;span class="nf"&gt;getDescription&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="no"&gt;DESCRIPTION&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;Enumeration above represents types of cars that we support (&lt;code&gt;Ford&lt;/code&gt; and &lt;code&gt;Ferrari&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="nc"&gt;CarType&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="no"&gt;FORD&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;Ford:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; 
  &lt;span class="no"&gt;FERRARI&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;Ferrari:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;new&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;Supplier&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;constructor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; 

  &lt;span class="nc"&gt;CarType&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Supplier&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;constructor&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;constructor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;constructor&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;Supplier&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getConstructor&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;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;constructor&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;Then we have the static method &lt;code&gt;getCar&lt;/code&gt; to create car objects encapsulated in the factory class &lt;br&gt;
&lt;code&gt;CarsFactory&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CarsFactory&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="nf"&gt;getCar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CarType&lt;/span&gt; &lt;span class="n"&gt;type&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="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getConstructor&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;get&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;Now on the client code we can create different types of cars using the factory class.&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;car1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CarsFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CarType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FORD&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;car2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CarsFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CarType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FERRARI&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="no"&gt;LOGGER&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;car1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDescription&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="no"&gt;LOGGER&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;car2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDescription&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Program output:&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="nc"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="nc"&gt;Ford&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="nc"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="nc"&gt;Ferrari&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Class Diagram
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7nHvErmd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/do29sdi4ry3bb05u5qm9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7nHvErmd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/do29sdi4ry3bb05u5qm9.png" alt="alt text" title="Factory pattern class diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Applicability
&lt;/h2&gt;

&lt;p&gt;Use the Simple Factory pattern when you only care about the creation of a object, not how to create &lt;br&gt;
and manage it.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allows keeping all objects creation in one place and avoid of spreading 'new' keyword across codebase.&lt;/li&gt;
&lt;li&gt;Allows to write loosely coupled code. Some of its main advantages include better testability, easy-to-understand code, swappable components, scalability and isolated features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The code becomes more complicated than it should be. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real world examples
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#getInstance--"&gt;java.util.Calendar#getInstance()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html#getBundle-java.lang.String-"&gt;java.util.ResourceBundle#getBundle()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/8/docs/api/java/text/NumberFormat.html#getInstance--"&gt;java.text.NumberFormat#getInstance()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html#forName-java.lang.String-"&gt;java.nio.charset.Charset#forName()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.oracle.com/javase/8/docs/api/java/net/URLStreamHandlerFactory.html"&gt;java.net.URLStreamHandlerFactory#createURLStreamHandler(String)&lt;/a&gt; (Returns different singleton objects, depending on a protocol)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html#of(E)"&gt;java.util.EnumSet#of()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBContext.html#createMarshaller--"&gt;javax.xml.bind.JAXBContext#createMarshaller()&lt;/a&gt; and other similar methods.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Related patterns
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.subho.xyz/posts/factory-method-design-pattern-2c94/"&gt;Factory Method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://java-design-patterns.com/patterns/factory-kit/"&gt;Factory Kit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://java-design-patterns.com/patterns/abstract-factory/"&gt;Abstract Factory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Code can be found &lt;a href="https://github.com/iluwatar/java-design-patterns/tree/master/factory"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Find out about more design patterns from &lt;a href="https://dev.to/ohbus/series/12844"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Credit to Original Authors of this post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/samilAyoub"&gt;Samil Ayoub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/iluwatar"&gt;Ilkka Seppälä&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Anurag870"&gt;Anurag870&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/qfxl"&gt;yonghong Xu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JackieNim"&gt;JackieNim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gkulkarni2020"&gt;Girish Kulkarni&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/RuchaDalsania"&gt;RuchaDalsania&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
      <category>designpatterns</category>
      <category>java</category>
      <category>gangoffour</category>
      <category>creational</category>
    </item>
    <item>
      <title>How to skip CI in GitHub Actions</title>
      <dc:creator>Subhrodip Mohanta</dc:creator>
      <pubDate>Tue, 23 Mar 2021 09:02:07 +0000</pubDate>
      <link>https://dev.to/ohbus/github-actions-now-skips-ci-3agm</link>
      <guid>https://dev.to/ohbus/github-actions-now-skips-ci-3agm</guid>
      <description>&lt;h3&gt;
  
  
  GitHub Actions now supports skipping workflows
&lt;/h3&gt;

&lt;p&gt;All &lt;strong&gt;&lt;code&gt;push&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;pull_request&lt;/code&gt;&lt;/strong&gt; workflows by looking for some common keywords in your commit message.&lt;/p&gt;

&lt;p&gt;If any commit message in your push or the HEAD commit of your PR contains one of the following strings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[skip ci]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[ci skip]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[no ci]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[skip actions]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[actions skip]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LusFXOuC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d65rki99xaej91e3b7rw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LusFXOuC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d65rki99xaej91e3b7rw.png" alt="SKIP CI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Workflows triggered on the &lt;strong&gt;&lt;code&gt;push&lt;/code&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;code&gt;pull_request&lt;/code&gt;&lt;/strong&gt; events will be skipped.&lt;/p&gt;




&lt;p&gt;This feature have been previously supported by all major CI like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.travis-ci.com/user/customizing-the-build#skipping-a-build"&gt;Travis CI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://circleci.com/docs/2.0/skip-build/"&gt;CircleCI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.gitlab.com/ee/ci/yaml/#skip-pipeline"&gt;GitLab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.atlassian.com/bitbucket-cloud/docs/bitbucket-pipelines-faqs/"&gt;Bitbucket Pipelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.appveyor.com/docs/how-to/filtering-commits/#skip-directive-in-commit-message"&gt;AppVeyor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://semaphoreci.com/docs/how-to-skip-building-for-some-commits-with-ci-skip.html"&gt;Semaphore CI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>github</category>
      <category>opensource</category>
      <category>pipeline</category>
    </item>
    <item>
      <title>Corona Virus Tracker Application</title>
      <dc:creator>Subhrodip Mohanta</dc:creator>
      <pubDate>Wed, 20 May 2020 07:46:56 +0000</pubDate>
      <link>https://dev.to/ohbus/corona-virus-tracker-application-305k</link>
      <guid>https://dev.to/ohbus/corona-virus-tracker-application-305k</guid>
      <description>&lt;h1&gt;
  
  
  I have made a Spring Boot Application that updates every 30 minutes to show the number of confirmed COVID-19 cases from across the globe in different regions
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fyremaxJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bamh9ip1j5h2s4gxlqc2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fyremaxJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bamh9ip1j5h2s4gxlqc2.gif" alt="Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Application Link : &lt;a href="https://covid.subho.xyz"&gt;covid.subho.xyz&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  Link to Code : &lt;a href="https://github.com/ohbus/covid-tracker"&gt;github.com/ohbus/covid-tracker&lt;/a&gt;
&lt;/h4&gt;

&lt;h3&gt;
  
  
  I have used Spring Boot Framework to build this application and link the backend to frontend using Thymeleaf to display the data. The application is packaged in a &lt;code&gt;jar&lt;/code&gt; and has also been &lt;code&gt;dockerized.&lt;/code&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Both of these packages can be found under &lt;a href="https://github.com/ohbus/covid-tracker/packages"&gt;packages&lt;/a&gt; and &lt;a href="https://github.com/ohbus/covid-tracker/releases"&gt;releases&lt;/a&gt; inside my &lt;a href="https://github.com/ohbus/covid-tracker"&gt;GitHub repo&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Zv-O9Plq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mzzv5pntre4wnnwxt40p.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Zv-O9Plq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mzzv5pntre4wnnwxt40p.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  I have been using &lt;a href="https://subho.xyz/git"&gt;GitKraken Pro&lt;/a&gt; which is absolutely amazing in managing projects. I would like to thank GitHub for providing uncountable tools and softwares for free to Student Developers
&lt;/h4&gt;

&lt;h5&gt;
  
  
  I would love if somebody to contribute to the project on developing the frontend part of this project as it has been the bare minimum.
&lt;/h5&gt;

&lt;h4&gt;
  
  
  Thank You.
&lt;/h4&gt;

</description>
      <category>octograd2020</category>
      <category>githubsdp</category>
      <category>spring</category>
      <category>java</category>
    </item>
  </channel>
</rss>
