190 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!--
 | |
| 
 | |
|     The MIT License
 | |
|     Copyright (c) 2017 Rodolfo Forte
 | |
| 
 | |
|     Permission is hereby granted, free of charge, to any person obtaining a copy
 | |
|     of this software and associated documentation files (the "Software"), to deal
 | |
|     in the Software without restriction, including without limitation the rights
 | |
|     to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | |
|     copies of the Software, and to permit persons to whom the Software is
 | |
|     furnished to do so, subject to the following conditions:
 | |
| 
 | |
|     The above copyright notice and this permission notice shall be included in
 | |
|     all copies or substantial portions of the Software.
 | |
| 
 | |
|     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
|     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
|     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | |
|     AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | |
|     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | |
|     OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | |
|     THE SOFTWARE.
 | |
| 
 | |
| -->
 | |
| <!DOCTYPE html>
 | |
| <html>
 | |
|   <head>
 | |
|     <title>Design Patterns - Abstract Factory Presentation</title>
 | |
|     <meta charset="utf-8">
 | |
|     <style>
 | |
|       @import url(https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz);
 | |
|       @import url(https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic);
 | |
|       @import url(https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic);
 | |
| 
 | |
|       body { font-family: 'Droid Serif'; }
 | |
|       h1, h2, h3 {
 | |
|         font-family: 'Yanone Kaffeesatz';
 | |
|         font-weight: normal;
 | |
|       }
 | |
|       .remark-code, .remark-inline-code { font-family: 'Ubuntu Mono'; }
 | |
| 	  
 | |
| 	  blockquote {
 | |
| 		border-left: 0.3em solid rgba(0,0,0,0.5);
 | |
| 		padding: 0 15px;
 | |
| 		font-style: italic;
 | |
| 	  }
 | |
| 	  
 | |
| 	  img {
 | |
| 		max-width:100%;
 | |
| 	  }
 | |
|     </style>
 | |
|   </head>
 | |
|   <body>
 | |
|     <textarea id="source">
 | |
| 
 | |
| class: center, middle
 | |
| 
 | |
| # Abstract Factory
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Also known as
 | |
| 
 | |
| * Kit
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Intent
 | |
| 
 | |
| * Provide an interface for creating families of related or dependent objects without specifying their concrete classes
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Explanation
 | |
| 
 | |
| * [Wikipedia](https://en.wikipedia.org/wiki/Abstract_factory_pattern) says:
 | |
|   > "The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes"
 | |
| 
 | |
| <br />
 | |
| 
 | |
| * In plain words:
 | |
|   * A factory that groups individual but related/dependent factories together without specifying their concrete classes;
 | |
|   * A factory of factories; 
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Example
 | |
| 
 | |
| * In a factory that creates kingdoms, we need objects with common theme:
 | |
| 
 | |
|   * Elven kingdom needs an Elven king, Elven castle and Elven army;
 | |
|   
 | |
|   * Orcish kingdom needs an Orcish king, Orcish castle and Orcish army;
 | |
| 
 | |
| <br />
 | |
|   
 | |
| * There is a dependency between the objects in the kingdom;
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Diagram
 | |
| 
 | |
| * Based on the kingdom example, the diagram below showcases the different concrete factories and their concrete products:
 | |
| 
 | |
| .center[]
 | |
| 
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Diagram
 | |
| 
 | |
| * The class diagram below showcases the factory of factories;
 | |
| 
 | |
| * At runtime, we can define which Kingdom type is needed and pass it as a parameter to define which concrete KingdomFactory to instantiate;
 | |
| 
 | |
| * The concrete factory returned will then be able to produce the related objects of the specified type;
 | |
|   
 | |
| .center[]
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Applicability
 | |
| 
 | |
| Use the Abstract Factory pattern when:
 | |
| 
 | |
| * A system should be independent of how its products are created, composed and represented;
 | |
| 
 | |
| * A system should be configured with one of multiple families of products;
 | |
| 
 | |
| * A family of related product objects is designed to be used together, and you need to enforce this constraint;
 | |
| 
 | |
| * You want to provide a class library of products, and you want to reveal just their interfaces, not their implementations;
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Applicability
 | |
| 
 | |
| Use the Abstract Factory pattern when:
 | |
| 
 | |
| * The lifetime of the dependency is conceptually shorter than the lifetime of the consumer;
 | |
| 
 | |
| * You need a run-time value to construct a particular dependency;
 | |
| 
 | |
| * You want to decide which product to call from a family at runtime;
 | |
| 
 | |
| * You need to supply one or more parameters only known at run-time before you can resolve a dependency;
 | |
| 
 | |
| ---
 | |
| 
 | |
| #Use Cases
 | |
| 
 | |
| * Selecting to call the appropriate implementation of FileSystemAcmeService or DatabaseAcmeService or NetworkAcmeService at runtime;
 | |
| * Unit test case writing becomes much easier;
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Consequences
 | |
| 
 | |
| * Dependency injection in java hides the service class dependencies that can lead to runtime errors that would have been caught at compile time
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Real world examples
 | |
| 
 | |
| [javax.xml.parsers.DocumentBuilderFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilderFactory.html)
 | |
| 
 | |
| [javax.xml.transform.TransformerFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newInstance--)
 | |
| 
 | |
| [javax.xml.xpath.XPathFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/xpath/XPathFactory.html#newInstance--)
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Credits
 | |
| 
 | |
| * [Design Patterns: Elements of Reusable Object-Oriented Software](http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612)
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Tutorials
 | |
| 
 | |
| * Source code http://java-design-patterns.com/patterns/abstract-factory/
 | |
| 
 | |
|     </textarea>
 | |
|     <script src="https://gnab.github.io/remark/downloads/remark-latest.min.js">
 | |
|     </script>
 | |
|     <script>
 | |
|       var slideshow = remark.create();
 | |
|     </script>
 | |
|   </body>
 | |
| </html> |