Lab6-Factory Pattern
Lab6-Factory Pattern
Pizza
- name : String
- dough : String
PizzaStore create - sauce : String
SimplePizzaFactory
factory : SimplePizzaFactory - toppings : ArrayList
createPizza()
orderPizza() + prepare()
+ bake()
+ cut()
+ box()
CheesePizza PepperoniPizza
VeggiePizza ClamPizza
Pizza Class:
public abstract public class Pizza {
protected String name;
protected String dough;
protected String sauce;
protected ArrayList<String> toppings = new ArrayList<String>();
public String getName() {
return name;
}
public void prepare() {
System.out.println("Preparing " + name);
}
public void bake() {
System.out.println("Baking " + name);
}
public void cut() {
System.out.println("Cutting " + name);
}
public void box() {
System.out.println("Boxing " + name);
}
public String toString() {
// code to display pizza name and ingredients
StringBuffer display = new StringBuffer();
display.append("---- " + name + " ----\n");
display.append(dough + "\n");
display.append(sauce + "\n");
for (int i = 0; i < toppings.size(); i++) {
display.append(toppings.get(i) + "\n");
}
return display.toString();
}
}
CheesePizza Class:
public class CheesePizza extends Pizza {
public CheesePizza() {
name = "Cheese Pizza";
dough = "Regular Crust";
sauce = "Marinara Pizza Sauce";
toppings.add("Fresh Mozzarella");
toppings.add("Parmesan");
}
}
ClamPizza Class:
public class ClamPizza extends Pizza {
public ClamPizza() {
name = "Clam Pizza";
dough = "Thin crust";
sauce = "White garlic sauce";
toppings.add("Clams");
toppings.add("Grated parmesan cheese");
}
}
VeggiePizza Class:
public class VeggiePizza extends Pizza {
public VeggiePizza() {
name = "Veggie Pizza";
dough = "Crust";
sauce = "Marinara sauce";
toppings.add("Shredded mozzarella");
toppings.add("Grated parmesan");
toppings.add("Diced onion");
toppings.add("Sliced mushrooms");
toppings.add("Sliced red pepper");
toppings.add("Sliced black olives");
}
}
PeperoniPizza Class:
public class PepperoniPizza extends Pizza {
public PepperoniPizza() {
name = "Pepperoni Pizza";
dough = "Crust";
sauce = "Marinara sauce";
toppings.add("Sliced Pepperoni");
toppings.add("Sliced Onion");
toppings.add("Grated parmesan cheese");
}
}
3. Tạo lớp SimpleFactory để tạo các đối tượng Pizza
public class SimplePizzaFactory {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
pizza = store.orderPizza("veggie");
System.out.println("We ordered a " + pizza.getName() + "\n");
}
}
II) FACTORY METHOD
Bài toán:
Giả sử công ty muốn mở nhiều cửa hàng bán Pizza ở nhiều thành phố khác nhau như Chicago
và Newyork, …
Từng cửa hàng bán các bánh Pizza được làm theo kiểu khác nhau phụ thuộc vào nơi cửa hàng
đặt và hương vị địa phương khác biệt của từng vùng.
Pizza
- name : String
- dough : String
PizzaStore
- sauce : String
- toppings : ArrayList
+ createPizza()
+ orderPizza() + prepare()
+ bake()
+ cut()
+ box()
NYStylePizzaStore
createPizza()
NYStyleCheesePizza ChicagoStyleCheesePizza
ChicagoStylePizzaStore NYStylePepperoniPizza ChicagoStylePepperoniPizza
NYStyleClamPizza ChicagoStyleClamPizza
createPizza()
NYStyleVeggiePizza ChicagoStyleVeggiePizza
create
create
NYStyleClamPizza Class:
public class NYStyleClamPizza extends Pizza {
public NYStyleClamPizza() {
name = "NY Style Clam Pizza";
dough = "Thin Crust Dough";
sauce = "Marinara Sauce";
toppings.add("Grated Reggiano Cheese");
toppings.add("Fresh Clams from Long Island Sound");
}
}
NYStyleVeggiePizza Class:
public class NYStyleVeggiePizza extends Pizza {
public NYStyleVeggiePizza() {
name = "NY Style Veggie Pizza";
dough = "Thin Crust Dough";
sauce = "Marinara Sauce";
toppings.add("Grated Reggiano Cheese");
toppings.add("Garlic");
toppings.add("Onion");
toppings.add("Mushrooms");
toppings.add("Red Pepper");
}
}
NYStylePeperoniPizza Class:
public class NYStylePepperoniPizza extends Pizza {
public NYStylePepperoniPizza() {
name = "NY Style Pepperoni Pizza";
dough = "Thin Crust Dough";
sauce = "Marinara Sauce";
toppings.add("Grated Reggiano Cheese");
toppings.add("Sliced Pepperoni");
toppings.add("Garlic");
toppings.add("Onion");
toppings.add("Mushrooms");
toppings.add("Red Pepper");
}
}
ChicagoStyleCheesePizza Class:
public class ChicagoStyleCheesePizza extends Pizza {
public ChicagoStyleCheesePizza() {
name = "Chicago Style Deep Dish Cheese Pizza";
dough = "Extra Thick Crust Dough";
sauce = "Plum Tomato Sauce";
toppings.add("Shredded Mozzarella Cheese");
}
ChicagoStyleClamPizza Class:
public class ChicagoStyleClamPizza extends Pizza {
public ChicagoStyleClamPizza() {
name = "Chicago Style Clam Pizza";
dough = "Extra Thick Crust Dough";
sauce = "Plum Tomato Sauce";
ChicagoStylePeperoniPizza Class:
public class ChicagoStylePepperoniPizza extends Pizza {
public ChicagoStylePepperoniPizza() {
name = "Chicago Style Pepperoni Pizza";
dough = "Extra Thick Crust Dough";
sauce = "Plum Tomato Sauce";
NYStylePizzaStore Class:
public class NYStylePizzaStore extends PizzaStore {
public Pizza createPizza(String item) {
// TO DO
}
}
ChicagoStylePizzaStore Class:
public class ChicagoStylePizzaStore extends PizzaStore {
public Pizza createPizza(String item) {
// TO DO
}
}
pizza = chicagoStore.orderPizza("cheese");
System.out.println("Joel ordered a " + pizza.getName() + "\n");
pizza = nyStore.orderPizza("clam");
System.out.println("Ethan ordered a " + pizza.getName() + "\n");
pizza = chicagoStore.orderPizza("clam");
System.out.println("Joel ordered a " + pizza.getName() + "\n");
pizza = nyStore.orderPizza("pepperoni");
System.out.println("Ethan ordered a " + pizza.getName() + "\n");
pizza = chicagoStore.orderPizza("pepperoni");
System.out.println("Joel ordered a " + pizza.getName() + "\n");
pizza = nyStore.orderPizza("veggie");
System.out.println("Ethan ordered a " + pizza.getName() + "\n");
pizza = chicagoStore.orderPizza("veggie");
System.out.println("Joel ordered a " + pizza.getName() + "\n");
}
}
Dùng Abtract Factory Pattern để tạo các họ chất liệu (dough, sauce, cheese, …) khác nhau
theo vùng NY, Chicago, …
createDough()
createSauce()
createVeggies()
createCheese() ThinCrustDough MarinaraSauce SlicedPepperoni
createPepperoni() ThickCrustDough PlumTomatoSauce
createClams()
<<Interface>>
Veggies
NYPizzaIngredientFactory <<Interface>>
<<Interface>>
Cheese Clams
createDough()
createSauce()
Garlic BlackOlives
createVeggies()
createCheese() Onion
createPepperoni() Spinach
FreshClams Mushroom
createClams() ReggianoCheese Eggplant
MozzarellaCheese FrozenClams RedPepper
ReggianoCheese
public class ReggianoCheese implements Cheese {
public String toString() {
return "Reggiano Cheese";
}
}
MozzarellaCheese
public class MozzarellaCheese implements Cheese {
public String toString() {
return "Shredded Mozzarella";
}
}
3. Tạo các lớp factory để tạo các thành phần nguyên liệu của Pizza cho NY và Chiacago:
PizzaIngredientFactory
public interface PizzaIngredientFactory {
public Dough createDough();
public Sauce createSauce();
public Cheese createCheese();
public Veggies[] createVeggies();
public Pepperoni createPepperoni();
public Clams createClam();
}
NYPizzaIngredientFactory
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
ChicagoPizzaIngredientFactory
public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {
prepare()
bake()
cut()
box()
ClamPizza
CheesePizza factory : PizzaIngredientFactory
factory : PizzaIngredientFactory prepare() PepperoniPizza
factory : PizzaIngredientFactory
prepare() VeggiePizza
factory : PizzaIngredientFactory prepare()
prepare()
Pizza Class
public abstract class Pizza {
protected String name;
protected Dough dough;
protected Sauce sauce;
protected Veggies veggies[];
protected Cheese cheese;
protected Pepperoni pepperoni;
protected Clams clam;
CheesePiza
public class CheesePizza extends Pizza {
private PizzaIngredientFactory ingredientFactory;
public CheesePizza(PizzaIngredientFactory ingredientFactory) {
this.ingredientFactory = ingredientFactory;
}
ClamPizza
public class ClamPizza extends Pizza {
private PizzaIngredientFactory ingredientFactory;
PepperoniPizza
public class PepperoniPizza extends Pizza {
private PizzaIngredientFactory ingredientFactory;
VeggiePizza
public class VeggiePizza extends Pizza {
private PizzaIngredientFactory ingredientFactory;
public VeggiePizza(PizzaIngredientFactory ingredientFactory) {
this.ingredientFactory = ingredientFactory;
}
5. Tạo PizzaStore
PizzaStore
public abstract class PizzaStore {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
NYPizzaStore
public class NYPizzaStore extends PizzaStore {
if (item.equals("cheese")) {
pizza = new CheesePizza(ingredientFactory);
pizza.setName("New York Style Cheese Pizza");
} else if (item.equals("veggie")) {
pizza = new VeggiePizza(ingredientFactory);
pizza.setName("New York Style Veggie Pizza");
} else if (item.equals("clam")) {
pizza = new ClamPizza(ingredientFactory);
pizza.setName("New York Style Clam Pizza");
} else if (item.equals("pepperoni")) {
pizza = new PepperoniPizza(ingredientFactory);
pizza.setName("New York Style Pepperoni Pizza");
}
return pizza;
}
}
ChicagoPizzaStore
public class ChicagoPizzaStore extends PizzaStore {
if (item.equals("cheese")) {
pizza = new CheesePizza(ingredientFactory);
pizza.setName("Chicago Style Cheese Pizza");
} else if (item.equals("veggie")) {
pizza = new VeggiePizza(ingredientFactory);
pizza.setName("Chicago Style Veggie Pizza");
} else if (item.equals("clam")) {
pizza = new ClamPizza(ingredientFactory);
pizza.setName("Chicago Style Clam Pizza");
} else if (item.equals("pepperoni")) {
pizza = new PepperoniPizza(ingredientFactory);
pizza.setName("Chicago Style Pepperoni Pizza");
}
return pizza;
}
}
pizza = chicagoStore.orderPizza("cheese");
System.out.println("Joel ordered a " + pizza + "\n");
pizza = nyStore.orderPizza("clam");
System.out.println("Ethan ordered a " + pizza + "\n");
pizza = chicagoStore.orderPizza("clam");
System.out.println("Joel ordered a " + pizza + "\n");
pizza = nyStore.orderPizza("pepperoni");
System.out.println("Ethan ordered a " + pizza + "\n");
pizza = chicagoStore.orderPizza("pepperoni");
System.out.println("Joel ordered a " + pizza + "\n");
pizza = nyStore.orderPizza("veggie");
System.out.println("Ethan ordered a " + pizza + "\n");
pizza = chicagoStore.orderPizza("veggie");
System.out.println("Joel ordered a " + pizza + "\n");
}
}