lecture 14: programming & religion

28
LECTURE 14: PROGRAMMING & RELIGION Religious Studies 313 – Advanced Programming Topics

Upload: eli

Post on 23-Feb-2016

46 views

Category:

Documents


0 download

DESCRIPTION

Religious Studies 313 – Advanced Programming Topics. Lecture 14: Programming & Religion. Why Use Factories?. Pizza pie = new DeepDish() ; pie = new Garlic( pie ) ; pie = new Garlic( pie ) ; pie = new Onion( pie ) ;. Onion. Garlic. Garlic. DDish. pie. Simple Factory Pattern. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Lecture 14: Programming & Religion

LECTURE 14:PROGRAMMING & RELIGION

Religious Studies 313 – Advanced Programming Topics

Page 2: Lecture 14: Programming & Religion

Why Use Factories?

Pizza pie = new DeepDish();pie = new Garlic(pie);pie = new Garlic(pie);pie = new Onion(pie);

OnionGarlic

GarlicDDish

pie

Page 3: Lecture 14: Programming & Religion

Simple Factory Pattern

Pizza pie = PizzaFactory.createPizza(type, toppings);

Pizza createPizza(String type, String[] toppings) {Pizza ret;if (type.equals(“DeepDish")) ret = new DeepDish();else ret = new Cracker();for (String s : toppings) { if (s.equals(“Garlic")) ret = new Garlic(ret); else if (s.equals(“Onion")) ret = new Onion(ret); else if (s.equals(“Fish")) ret = new Anchovy(ret); else throw new BadToppingException("Moron!");}return ret;

}

Page 4: Lecture 14: Programming & Religion

Simple Factory Overview

Page 5: Lecture 14: Programming & Religion

Simple Factory Overview

Instantiation in method to limit instantiation Often have entire class only with method Static or instance-based method can be

used* Call simple factory to replace new

command Method contains all new keeping client

code pure When change occurs, update factory

method only

Page 6: Lecture 14: Programming & Religion

Simple Factory Overview

Instantiation in method to limit instantiation Often have entire class only with method Static or instance-based method can be

used* Call simple factory to replace new

command Method contains all new keeping client

code pure When change occurs, update factory

method only

* Do not make this method static

Page 7: Lecture 14: Programming & Religion

Simple Factory Overview

Little design required to use Simple Factory Within program, much easier to add & use

classes Easy to write since need factory & classes

to use Code that most often needs to change is

isolated Client relies on abstraction simple factory

provides

Page 8: Lecture 14: Programming & Religion

Simple Factory UML

Client code calls method in SimpleFactory

AbstractProduct returned by this method Specific type unknown, really a ConcreteProduct

Client need not know about ConcreteProducts

Page 9: Lecture 14: Programming & Religion

Speaking of Pizza ToppingsOtto von Bismarck _____ are like

sausages. It's better not to see

them being made.

Page 10: Lecture 14: Programming & Religion

In The Beginning…

Creator

Product

Page 11: Lecture 14: Programming & Religion

Problem with Simple Factory Approach requires single way to view world

Assimilates everything that comes into contact with it

Pizza createPizza(String type, String[] toppings) {Pizza ret;if (type.equals(“DeepDish")) ret = new DeepDish();else ret = new Cracker();for (String s : toppings) { if (s.equals(“Garlic")) ret = new Garlic(ret); else if (s.equals(“Onion")) ret = new Onion(ret); else if (s.equals(“Fish")) ret = new Anchovy(ret); else ret = new Cheese(ret);}return ret;

}

Page 12: Lecture 14: Programming & Religion

Dependency Inversion

Design like you code; Start with the abstractions

Page 13: Lecture 14: Programming & Religion

Dependency Inversion

Design like you I code; Start with the abstractions

Page 14: Lecture 14: Programming & Religion

Dependency Inversion

Design like you I someone good codes; Start with the abstractions

Page 15: Lecture 14: Programming & Religion

Bottoms-Up!

Design like you I someone good codes; Start with the abstractions

Begin by finding what ideas have in common Use for interface or abstract class used by

classes With concepts, design client code & write

classes

Concepts limit damage others can do to you If design include concrete classes, ask

questions

Page 16: Lecture 14: Programming & Religion

Design to Concept, Too

Simple factory created as need arises Many related classes created for use

later Methods becoming bloated with options Room for growth wanted even if not

used These cases are all about classes

Means to an end is only reason for simple factory

Concrete classes not conceptualized or planned

No design work going into Simple Factory

Page 17: Lecture 14: Programming & Religion

Problem with Simple Factory createPizza entirely dependent on 6 classes

Must change whenever these constructors modified

Pizza createPizza(String type, String[] toppings) {Pizza ret;if (type.equals(“DeepDish")) ret = new DeepDish();else ret = new Cracker();for (String s : toppings) { if (s.equals(“Garlic")) ret = new Garlic(ret); else if (s.equals(“Onion")) ret = new Onion(ret); else if (s.equals(“Fish")) ret = new Anchovy(ret); else ret = new Cheese(ret);}return ret;

}

Page 18: Lecture 14: Programming & Religion

What if…

Page 19: Lecture 14: Programming & Religion

Or We Had…

Page 20: Lecture 14: Programming & Religion

Simple Factory

public class PizzaFactory { Pizza createPizza(String type, String[] toppings) {

Pizza ret;if (type.equals(“DeepDish")) ret = new DeepDish();else ret = new Cracker();for (String s : toppings) { if (s.equals(“Garlic")) ret = new Garlic(ret); else if (s.equals(“Onion")) ret = new Onion(ret); else if (s.equals(“Fish")) ret = new Anchovy(ret); else ret = new Cheese(ret);}return ret;

}}

Page 21: Lecture 14: Programming & Religion

Factory Method Pattern

public abstract class PizzaFactory { Pizza createPizza(String type, String[] toppings) {

Pizza ret = createPizzaType();for (String s : toppings) { if (s.equals(“Garlic")) ret = new Garlic(ret); else if (s.equals(“Onion")) ret = new Onion(ret); else if (s.equals(“Fish")) ret = new Anchovy(ret); else ret = new Cheese(ret);}return ret;

} abstract Pizza createPizzaType();}

Page 22: Lecture 14: Programming & Religion

Factory Method Pattern

public class DeepDishFactory extends PizzaFactory { Pizza createPizzaType() {

return new DeepDish();}

}

public class ThinCrustFactory extends PizzaFactory { Pizza createPizzaType() {

return new Cracker();}

}

Page 23: Lecture 14: Programming & Religion

Factory Method UML

Clients call method in AbstractFactory ConcreteFactory unknown by the clients

Page 24: Lecture 14: Programming & Religion

Factory Method UML

Clients call method in AbstractFactory ConcreteFactory unknown by the clients

Page 25: Lecture 14: Programming & Religion

Factory Method Process

AbstractCreator defines factory Usually either an interface or abstract class Does not instantiate any actual Products

Instances allocated by ConcreteCreators Each Product has own ConcreteCreator

Develop lines using many ConcreteCreators DeepDishFactory & ThinCrustFactory needed To create product lines for DeepDish & Cracker

Page 26: Lecture 14: Programming & Religion

Factory Method Intent

Interface & abstract class types always used for: Variables Fields Parameters Statics

Any & all required concreteness left for: Factory methods Code on critical path (& only if performance is

critical)

Page 27: Lecture 14: Programming & Religion

Factory Method Intent

Interface & abstract class types always used for: Variables Fields Parameters Statics

Any & all required concreteness left for: Factory methods Code on critical path (& only if performance is

critical)

Code passing “What would _______ code?” test

Page 28: Lecture 14: Programming & Religion

For Next Lecture

Lab #4 available on web/Angel Due before next lab (Fri. 2/26)

Read pages 144 - 162 in the book How can we easily enable skinnable

applications? Could I make even odder religious

references?