LECTURE 15:PROGRAMMING & RELIGION
Religious Studies 313 – Advanced Programming Topics
Today’s Goals
Going to hell/lightning striking me down avoided
Need for factories with other patterns shown What is problem creating pattern instances?
Simple factory trashed after its discussed First, we will be reviewing how these work Situation it helps will be examined in detail And then highlight limitations of this
approach Solve the problem with Factory Method
pattern Show how it provides better, more general,
approach
Why Use Factories?
Pizza pie = new DeepDish();
pie = new Garlic(pie);
pie = new Garlic(pie);
pie = new Onion(pie);
Onion
Garlic
GarlicDDish
pie
Speaking of Pizza ToppingsOtto von Bismarck _____ are like
sausages. It's better not to see
them being made.
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);}return ret;
}
Simple Factory Overview
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
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
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
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
In The Beginning…
In The Beginning…
Creator
Product
Problem with Simple Factory Approach requires single way to view
world Assimilates everything that comes into
contact with itPizza 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);}return ret;
}
Dependency Inversion
Design like you code; Start with the abstractions
Dependency Inversion
Design like you I code; Start with the abstractions
Dependency Inversion
Design like you I someone good codes; Start with the abstractions
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
Limit the damage others can do to you If design include concrete classes, ask
questions
Design to Concept, Not Class 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
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);}return ret;
}
What if…
Or We Had…
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;
}
}
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();
}
Factory Method Pattern
public class DeepDishFactory extends PizzaFactory {
Pizza createPizzaType() { return new DeepDish();}
}
public class ThinCrustFactory extends PizzaFactory {
Pizza createPizzaType() { return new Cracker();}
}
Factory Method UML
Clients call method in AbstractFactory ConcreteFactory unknown by the clients
Factory Method UML
Clients call method in AbstractFactory ConcreteFactory unknown by the clients
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
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 (when performance is
critical)
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 (when performance is
critical)
Code passing “What would _______ code?” test
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 (when performance is
critical)
Code passing “What would _______ code?” test
For Next Lecture
Lab #3 still available on Angel Use Assignment Submitter before Fri. lab
(Feb. 24)
Read pages 144 - 162 in the book How can we easily enable skinnable
applications? Cars made in factories, but what pattern do
they use?