310 likes | 409 Views
Religious Studies 313 – Advanced Programming Topics. Lecture 15: Programming & Religion. 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
E N D
Religious Studies 313 – Advanced Programming Topics Lecture 15:Programming & Religion
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 Garlic DDish pie
Speaking of Pizza Toppings Otto 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 • 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 newkeeping 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 newkeeping 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… Creator Product
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);}return ret; }
Dependency Inversion Design like youcode; Start with the abstractions
Dependency Inversion Design like you Icode; 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; }
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); elseret = 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); elseret = new Cheese(ret);}return ret; } abstract Pizza createPizzaType(); }
Factory Method Pattern public class DeepDishFactoryextends 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 • AbstractCreatordefines factory • Usually either an interface or abstract class • Does not instantiate any actual Products • Instances allocated byConcreteCreators • Each Product has own ConcreteCreator • Develop lines using many ConcreteCreators • DeepDishFactory & ThinCrustFactoryneeded • 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?