Slide 1

Slide 1 text

jgs CSE 460 Software Analysis and Design Lecture 18: Additional Design Patterns Dr. Javier Gonzalez-Sanchez [email protected] javiergs.engineering.asu.edu | javiergs.com PERALTA 230U Office Hours: By appointment

Slide 2

Slide 2 text

jgs 460 00010010 Announcement § Quiz 05 is due tonight. It opens at the end of the lecture

Slide 3

Slide 3 text

jgs 460 00010010 Singleton

Slide 4

Slide 4 text

jgs 460 00010010 Singleton class Main { public static void main(String []a){ // Constructor is protected -- cannot use new Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); // Test for same instance if (s1 == s2){ // true - Objects are the same instance } } }

Slide 5

Slide 5 text

jgs 460 00010010 Singleton class Singleton{ private static Singleton instance; // Constructor is 'protected' protected Singleton() {} public static Singleton getInstance(){ if (instance == null){ instance = new Singleton(); } return instance; } }

Slide 6

Slide 6 text

jgs 460 00010010 Practice

Slide 7

Slide 7 text

jgs 460 00010010 A Singleton

Slide 8

Slide 8 text

jgs 460 00010010 Add More Objects

Slide 9

Slide 9 text

jgs 460 00010010 Previously …

Slide 10

Slide 10 text

jgs 460 00010010 Next

Slide 11

Slide 11 text

jgs 460 00010010 Chain of Responsibilities, Factory, Adapter

Slide 12

Slide 12 text

jgs Chain of Responsibility Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.

Slide 13

Slide 13 text

jgs 460 00010010 Chain of Responsibility

Slide 14

Slide 14 text

jgs 460 00010010 Chain of Responsibility vs Composite vs Decorator

Slide 15

Slide 15 text

jgs 460 00010010 Chain of Responsibility public class Client { public static void main(String[] args) { // Setup Chain of Responsibility ConcreteHandler2 h1 = new ConcreteHandler2(); ConcreteHandler2 h2 = new ConcreteHandler2(); ConcreteHandler1 h3 = new ConcreteHandler1(); h1.setSuccessor(h2); h2.setSuccessor(h3); // Generate and process request int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 }; for (int i = 0; i < requests.length; i++) { h1.HandleRequest(requests[i]); } } }

Slide 16

Slide 16 text

jgs 460 00010010 Handler abstract class Handler { public abstract void HandleRequest(int request); }

Slide 17

Slide 17 text

jgs 460 00010010 ConcreteHandler1 class ConcreteHandler1 extends Handler { public void HandleRequest(int request) { System.out.println("I am the last in line"); } }

Slide 18

Slide 18 text

jgs 460 00010010 ConcreteHandler2 class ConcreteHandler2 extends Handler { protected Handler successor; public void setSuccessor(Handler successor) { this.successor = successor; } public void HandleRequest(int request) { if (request >= 10 && request < 20) { // code here System.out.println("I am the handling it"); } else if (successor != null) { System.out.println("Passing it..."); successor.HandleRequest(request); } } }

Slide 19

Slide 19 text

jgs Factory Wrapper of a constructor One entire object to be built in a single method call

Slide 20

Slide 20 text

jgs 460 00010010 Next

Slide 21

Slide 21 text

jgs 460 00010010 Abstract Factory

Slide 22

Slide 22 text

jgs 460 00010010 Products public interface Shape { void draw(); } public class RoundedRectangle implements Shape { public void draw() { System.out.println("Inside RoundedRectangle/draw() method."); } } public class RoundedSquare implements Shape { public void draw() { System.out.println("Inside RoundedSquare/draw() method."); } } public class Rectangle implements Shape { public void draw() { System.out.println("Inside Rectangle/draw() method."); } }

Slide 23

Slide 23 text

jgs 460 00010010 Factories public abstract class AbstractFactory { Shape getShape(String shapeType) {} } public class ShapeFactory extends AbstractFactory { public Shape getShape(String shapeType){ if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new Rectangle(); }else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } }

Slide 24

Slide 24 text

jgs 460 00010010 Factories public class RoundedShapeFactory extends AbstractFactory { public Shape getShape(String shapeType){ if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new RoundedRectangle(); }else if(shapeType.equalsIgnoreCase("SQUARE")){ return new RoundedSquare(); } return null; } }

Slide 25

Slide 25 text

jgs 460 00010010 Client public class Client { public static void main(String[] args) { AbstractFactory shapeFactory = new ShapeFactory(); //get an object of Shape Rectangle Shape shape1 = shapeFactory.getShape("RECTANGLE"); //call draw method of Shape Rectangle shape1.draw(); //get an object of Shape Square Shape shape2 = shapeFactory.getShape("SQUARE"); //call draw method of Shape Square shape2.draw(); ] //get shape factory AbstractFactory shapeFactory1 = new RoundedShapeFactory(); //get an object of Shape Rectangle Shape shape3 = shapeFactory1.getShape("RECTANGLE"); //call draw method of Shape Rectangle shape3.draw(); //get an object of Shape Square Shape shape4 = shapeFactory1.getShape("SQUARE"); //call draw method of Shape Square shape4.draw(); } }

Slide 26

Slide 26 text

jgs CSE 460 Software Analysis and Design Javier Gonzalez-Sanchez [email protected] Fall 2020 Disclaimer. These slides can only be used as study material for the class CSE460 at ASU. They cannot be distributed or used for another purpose.