25
DESIGN PATTERN FACTORY By Irwan Fathurrahman

Design Pattern with Burger

Embed Size (px)

DESCRIPTION

PT.BUZOO INDONESIA is No1 Japanese offshore development company in Indonesia. We are professional of web solution and smartphone apps. We can support Japanese, English and Indonesia. We are hiring now at http://buzoo.co.id/

Citation preview

Page 1: Design Pattern with Burger

DESIGN PATTERNFACTORY

By Irwan Fathurrahman

Page 2: Design Pattern with Burger
Page 3: Design Pattern with Burger

Order Burger

prepare bake

fillingpresentation

Page 4: Design Pattern with Burger

Public Burger orderBurger(){Burger burger = new Burger();

burger.prepare();burger.bake();burger.filling();burger.presentation();

return burger;}

Our store can take and give the order.

This is the simple way for our function to take order based of strategy in previous slide

Page 5: Design Pattern with Burger

But our store just have one kind of Burger!

We have to create 4 menu!

Page 6: Design Pattern with Burger

Public Burger orderBurger(String type){Burger burger;

if(type == “cheese”){burger = new CheeseBurger();

} else if(type == “double cheese”){burger = new DoubleCheeseBurger();

} else if(type == “beef”){burger = new BeefBurger();

} else if(type == “doublebeef”){burger = new DoubleBeefBurger();

}

burger.prepare();burger.bake();burger.filling();burger.presentation();

return burger;}

That it!Our store can take 4 kind of Burger.

- Cheese Burger- Double Cheese

Burger- Beef Burger- Double Beef

Burger

Page 7: Design Pattern with Burger

But! What about we add new burger and remove old Burger?

Page 8: Design Pattern with Burger

Public Burger orderBurger(String type){Burger burger;

if(type == “cheese”){burger = new CheeseBurger();

} else if(type == “double cheese”){burger = new DoubleCheeseBurger();

} else if(type == “beef”){burger = new BeefBurger();

} else if(type == “doublebeef”){burger = new DoubleBeefBurger();

} else if(type == “chesse&beef”){burger = new CheeseBeefBurger();

}

burger.prepare();burger.bake();burger.filling();burger.presentation();

return burger;}

It mess our order burger method and make order burger closed modification

Page 9: Design Pattern with Burger

Public class BurgerStore{ BurgerFactory factory; Public BurgerStore(BurgerFactory factory){ this.factory = factory; }

Public Burger orderBurger(String type){ Burger burger = factory.createBurger(type); burger.prepare(); burger.bake(); burger.filling(); burger.presentation();

return burger; }}

Make simple factory that can produce one kind burger.

SOLUTION! -> simple factory

Public class BurgerFactory{

Public Burger createBurger(String type){ Burger burger;

if(type == “cheese”){

burger = new CheeseBurger(); } else if(type == “beef”){

burger = new BeefBurger(); } else if(type == “doublebeef”){

burger = new DoubleBeefBurger(); } else if(type == “chesse&beef”){

burger = new CheeseBeefBurger(); }

return burger; }}

Page 10: Design Pattern with Burger

Now, we can sell our Burgers!

Page 11: Design Pattern with Burger

Oh Look! Our store expands!Now we have 2 store, but have different menu

Page 12: Design Pattern with Burger

Back to old solution?Because our both store have different menu, we

can’t have same factory

Page 13: Design Pattern with Burger

- It can be a solution. Each store can choose their own factory.- But if other store share one factory and suddenly add their own

menu, it can be a problem later.

Add 2 factory

Public class BurgerFactoryStore1{

Public Burger createBurger(String type){ Burger burger;

if(type == “cheese”){

burger = new CheeseBurger(); } else if(type == “beef”){

burger = new BeefBurger(); } else if(type == “doublebeef”){

burger = new DoubleBeefBurger(); } else if(type == “chesse&beef”){

burger = new CheeseBeefBurger(); }

return burger; }}

Public class BurgerFactoryStore2{

Public Burger createBurger(String type){ Burger burger;

if(type == “cheese”){

burger = new CheeseBurger(); } else if(type == “doublecheese”){

burger = new DoubleCheeseBurger(); } else if(type == “beef”){

burger = new BeefBurger(); } else if(type == “doublebeef”){

burger = new DoubleBeefBurger(); } return burger; }}

Page 14: Design Pattern with Burger

Solution?What about we make every store decide their

own menu?

Page 15: Design Pattern with Burger

Public abstract class BurgerStore{ BurgerFactory factory; Public BurgerStore(BurgerFactory factory){ this.factory = factory; }

Public Burger orderBurger(String type){ Burger burger = createBurger(type); burger.prepare(); burger.bake(); burger.filling(); burger.presentation();

return burger; }

Public abstract Burger createBurger (String type);}

We just make interface for our store, but they can decide their own

menu.

SOLUTION! -> factory method Public class Store1 extends BurgerStore{

Public Burger createBurger(String type){ Burger burger;

if(type == “cheese”){

burger = new CheeseBurger(); } else if(type == “beef”){

burger = new BeefBurger(); } return burger;

}}

Public class Store2 extends BurgerStore{

Public Burger createBurger(String type){ Burger burger;

if(type == “beef”){

burger = new BeefBurger(); } else if(type == “doublebeef”){

burger = new DoubleBeefBurger(); } return burger;

}}

Page 16: Design Pattern with Burger

But we have other problem!Customer want other style of vegetable and beef

too.

Page 17: Design Pattern with Burger

Public abstract class Burger{ Beef factory; Vegetable vegetable;

Public abstract void prepare();

Public void bake(){ // some method }

Public void filling(){ // some method }

Public void presentation(){ // some method }}

One of our kind of Burger

Look our Burger

Public class ChesseBburger extends Burger{ Public void ChesseBburger(// need ingredient){

}

Public void prepare(){};

}

Page 18: Design Pattern with Burger

Public interface IngredientFactory {

Public Beef createBeef(); Public Vegetable createVegetable();}

This our ingredient creator

Need ingredient factory that create beef and vegetable

Public class IndonesianBurgerIngredientFactory {

Public Beef createBeef(){ return new SapiLadaHitam(); } Public Vegetable createVegetable(){ return new Kangkung(); }}

Public class JapaneseBurgerIngredientFactory {

Public Beef createBeef(){ return new FreshFish(); } Public Vegetable createVegetable(){ return new Nori(); }}

Page 19: Design Pattern with Burger

Public class ChesseBburger extends Burger{ IngredientFactory ingredient;

Public void ChesseBburger( IngredientFactory ingredient){ this.Ingredient = ingredient;

}

Public void prepare(){ ingredient.createBeef(); ingredient.createVegetable(); };

}

Solution! -> Abstract Factory Method

Now we can take ingredient style customer want without affecting our method in burger.

Public class Store1 extends BurgerStore{

Public Burger createBurger(String type, IngredientFactory ingredient){ Burger burger;

if(type == “cheese”){

burger = new CheeseBurger(ingredient); } else if(type == “beef”){

burger = new BeefBurger(ingredient); } return burger;

}}

Page 20: Design Pattern with Burger

Review Simple factory is a simple way to decouple our

client from concrete class. Factory Method relies on inheritance : object

creation is delegated to subclasses which implement the factory method to create object.

Abstract factory Method relies on object composition : ocject creation is implemented in method exposed in factory interface.

Page 21: Design Pattern with Burger

Review All factory pattern promote loose coupling by

reducing the depedency on concrete class.

Concrete class is class which will be an object concrete.

Page 22: Design Pattern with Burger

Design Pattern Is a description or template for how to solve a

problem that can be used in many different situations.

Design patterns are optimized, reusable solutions to the programming problems that we encounter every day.

Page 23: Design Pattern with Burger

Design Principle Take the parts that vary and encapsulate them. So, we can can alter or extend that vary later

without affecting those that don’t.

Page 24: Design Pattern with Burger

Design Principle Code for an interface, not code for and

implementation.

Page 25: Design Pattern with Burger

Design Principle Depend upon abstraction, don’t upon concrete

class.