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>
							 |