diff --git a/README.md b/README.md index 9e0034c..ec9573c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,32 @@ -# DesignPatternsJava9 -This repo consists Gang of Four Design patterns code on Java 9. Each branch in the repository has code of 1 design pattern. Switch repository to try out different design patterns. +# What is Flyweight Design Pattern +Flyweight pattern tries to reuse already existing similar kind objects by storing them and creates new object when no matching object is found. Flyweight pattern is used to reduce the number of objects created and to decrease memory footprint and increase performance. + +## Diagram +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/flyweight-pattern/diagrams/Flyweight%20Pattern%20class%20diagram.jpeg "Diagram") + +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/flyweight-pattern/diagrams/Milky_Way-100_billion_stars.jpg "Diagram") + +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/flyweight-pattern/diagrams/Flyweight%20pattern%20sequence%20diagram.png "Diagram") + +### When to use Flyweight Design Pattern +Flyweight pattern is used when we need to create a large number of similar objects (which are immutable). This reduces memory foot print and keeps app awary from java.lang.OutOfMemoryError. + +### Learn Design Patterns with Java by Aseem Jain +This repository contains working project code used in video Course by Packt Publication with title "Learn Design Patterns with Java " authored by "Aseem Jain". + +### Course link: +https://www.packtpub.com/application-development/learn-design-patterns-java-9-video + +### ![ http://in.linkedin.com/in/premaseem](https://github.com/premaseem/DesignPatternsJava9/blob/master/linkedin.png "http://in.linkedin.com/in/premaseem") Profile: http://in.linkedin.com/in/premaseem + +### Authors blog on design patterns: +https://premaseem.wordpress.com/category/computers/design-patterns/ + +### Software Design pattern community face book page: +https://www.facebook.com/DesignPatternGuru/ + +### Note: +* This code base will work on Java 9 and above versions. +* `diagrams` folders carry UML diagrams. +* `pattern` folder has code of primary example. +* `patternBonus` folder has code of secondary or bonus example. diff --git a/diagrams/Flyweight Pattern class diagram.jpeg b/diagrams/Flyweight Pattern class diagram.jpeg new file mode 100644 index 0000000..bfed62a Binary files /dev/null and b/diagrams/Flyweight Pattern class diagram.jpeg differ diff --git a/diagrams/Flyweight pattern sequence diagram.png b/diagrams/Flyweight pattern sequence diagram.png new file mode 100644 index 0000000..960926e Binary files /dev/null and b/diagrams/Flyweight pattern sequence diagram.png differ diff --git a/diagrams/Milky_Way-100_billion_stars.jpg b/diagrams/Milky_Way-100_billion_stars.jpg new file mode 100644 index 0000000..9ce392e Binary files /dev/null and b/diagrams/Milky_Way-100_billion_stars.jpg differ diff --git a/pattern/src/com/premaseem/Client.java b/pattern/src/com/premaseem/Client.java index 15f05df..207145a 100644 --- a/pattern/src/com/premaseem/Client.java +++ b/pattern/src/com/premaseem/Client.java @@ -4,10 +4,75 @@ @author: Aseem Jain @title: Design Patterns with Java 9 @link: https://premaseem.wordpress.com/category/computers/design-patterns/ -@copyright: 2018 Packt Publication */ public class Client { public static void main (String[] args) { - System.out.println("Singleton cook example "); + System.out.println("Flyweight design pattern using ** STAR WARS ** example"); + + // Create Landscape object which is responsible to display stars + Landscape landscape = new Landscape(); + + // Factory will provide star based on param + // Note: Factory will cache objects for reuse + // and will create new object only when it does not exist in cache. + Star star = StarFactory.getStar("dull"); + + landscape.displayStar(star,65,87); + + // No new object needs to be created, Factory provides reusable object + // from cache which landscape displays + landscape.displayStar(StarFactory.getStar("bright"),34,43); + landscape.displayStar(StarFactory.getStar("bright"),36,47); + landscape.displayStar(StarFactory.getStar("dull"),34,43); + landscape.displayStar(StarFactory.getStar("dim"),34,43); + landscape.displayStar(StarFactory.getStar("dim"),34,43); + + + + + /* OLD Scrapped code + // Created 1000 stars with brightness level bright + Star brightStar1 = new Star("bright"); + Star brightStar2 = new Star("bright"); + Star brightStar3 = new Star("bright"); + Star brightStar4 = new Star("bright"); + Star brightStar5 = new Star("bright"); + Star brightStar1000 = new Star("bright"); + + // Created 1000 stars with brightness level dim + Star dimStar1 = new Star("dim"); + Star dimStar2 = new Star("dim"); + Star dimStar3 = new Star("dim"); + Star dimStar4 = new Star("dim"); + Star dimStar5 = new Star("dim"); + Star dimStar1000 = new Star("dim"); + + // Created 1000 stars with brightness level dull + Star dullStar1 = new Star("dull"); + Star dullStar2 = new Star("dull"); + Star dullStar3 = new Star("dull"); + Star dullStar4 = new Star("dull"); + Star dullStar5 = new Star("dull"); + Star dullStar1000 = new Star("dull"); + + // Create Landscape object which is responsible to display stars + Landscape landscape = new Landscape(); + + landscape.displayStar(brightStar1,34,45); + landscape.displayStar(brightStar2,34,45); + landscape.displayStar(brightStar3,23,65); + landscape.displayStar(brightStar1000,34,45); + + landscape.displayStar(dimStar1,34,45); + landscape.displayStar(dimStar2,54,45); + landscape.displayStar(dimStar3,34,45); + landscape.displayStar(dimStar4,34,45); + landscape.displayStar(dimStar1000,34,45); + + landscape.displayStar(dullStar1,87,90); + landscape.displayStar(dullStar2,34,45); + landscape.displayStar(dullStar3,23,55); + landscape.displayStar(dullStar1000,34,45); + */ } } diff --git a/pattern/src/com/premaseem/Landscape.java b/pattern/src/com/premaseem/Landscape.java new file mode 100644 index 0000000..200da94 --- /dev/null +++ b/pattern/src/com/premaseem/Landscape.java @@ -0,0 +1,13 @@ +package com.premaseem; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ +public class Landscape { + + public void displayStar (Star star, int xCoord, int yCoord) { + System.out.println("logic to display a "+ star +" at X / Y coordinates "); + } +} diff --git a/pattern/src/com/premaseem/Star.java b/pattern/src/com/premaseem/Star.java new file mode 100644 index 0000000..b3a386e --- /dev/null +++ b/pattern/src/com/premaseem/Star.java @@ -0,0 +1,67 @@ +package com.premaseem; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ +public interface Star { + void displayBrightness (); +} + +class BrightStar implements Star { + + private String brightness; + + public BrightStar () { + this.brightness = "bright"; + } + + @Override + public void displayBrightness () { + System.out.println("Star with brightness :" + brightness); + } + + @Override + public String toString () { + return "Star with brightness :" + brightness; + } +} + +class DimStar implements Star { + + private String brightness; + + public DimStar () { + this.brightness = "dim"; + } + + @Override + public void displayBrightness () { + System.out.println("Star with brightness :" + brightness); + } + + @Override + public String toString () { + return "Star with brightness :" + brightness; + } +} + +class DullStar implements Star { + + private String brightness; + + public DullStar () { + this.brightness = "dull"; + } + + @Override + public void displayBrightness () { + System.out.println("Star with brightness :" + brightness); + } + + @Override + public String toString () { + return "Star with brightness :" + brightness; + } +} diff --git a/pattern/src/com/premaseem/StarFactory.java b/pattern/src/com/premaseem/StarFactory.java new file mode 100644 index 0000000..f7ee8b7 --- /dev/null +++ b/pattern/src/com/premaseem/StarFactory.java @@ -0,0 +1,41 @@ +package com.premaseem; + +import java.util.HashMap; +import java.util.Map; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ +public class StarFactory { + static Map starCache = new HashMap<>(); + + public static Star getStar (String brightnessLevel) { + + // First try to retrieve object from cache + Star star = starCache.get(brightnessLevel); + + // if star does not exist in cache then factory will create one and store it in cache + if (star == null) { + if (brightnessLevel.equalsIgnoreCase("bright")) { + star = new BrightStar(); + starCache.put("bright",star); + } + if (brightnessLevel.equalsIgnoreCase("dim")) { + star = new DimStar(); + starCache.put("dim",star); + } + if (brightnessLevel.equalsIgnoreCase("dull")) { + star = new DullStar(); + starCache.put("dull",star); + } + + } + // return star object for reuse + return star; + } + + +} + diff --git a/patternBonus/src/com/premaseem/Client.java b/patternBonus/src/com/premaseem/Client.java deleted file mode 100644 index 15f05df..0000000 --- a/patternBonus/src/com/premaseem/Client.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.premaseem; - -/* -@author: Aseem Jain -@title: Design Patterns with Java 9 -@link: https://premaseem.wordpress.com/category/computers/design-patterns/ -@copyright: 2018 Packt Publication -*/ -public class Client { - public static void main (String[] args) { - System.out.println("Singleton cook example "); - } -}