Download as pdf or txt
Download as pdf or txt
You are on page 1of 16

Abstract Factory

Manohar Thummala
Bharat Khatri
Govind Chintapalli
Mohana Sai Cherukuri
Pizza Store
Pizza Store

Pizza orderPizza(String type) {


Pizza pizza;
if (type.equals(“cheese”)) {
pizza = new CheesePizza();
} else if (type.equals(“greek”) {
pizza = new GreekPizza();
} else if (type.equals(“pepperoni”) {
pizza = new PepperoniPizza();
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
Problem ?
The problem starts with objects' creation
(new in Java).
Pizza Store New Pizza Store
Pizza orderPizza(String type) { Pizza orderPizza(String type) {
Pizza pizza; Pizza pizza;
if (type.equals(“cheese”)) { if (type.equals(“cheese”)) {
pizza = new CheesePizza(); pizza = new CheesePizza();
} else if (type.equals(“greek”) { } else if (type.equals(“greek”) {
pizza = new GreekPizza(); pizza = new GreekPizza();
} else if (type.equals(“pepperoni”) { } else if (type.equals(“pepperoni”) {
pizza = new PepperoniPizza(); pizza = new PepperoniPizza();
} }
pizza.prepare(); pizza.prepare();
pizza.bake(); pizza.bake();
pizza.cut(); pizza.cut();
pizza.box(); pizza.box();
return pizza; return pizza;
} }
Solution
Encapsulate the change into a class which
creates objects.
Product - Objects (that need to be
instantiated)

Factory - The class that encapsulates the


creation of products.

Client - The class that performs actions on the


products.
public class SimplePizzaFactory {
public Pizza createPizza(String type) {
Pizza pizza = null;
Pizza orderPizza(String type) { if (type.equals(“cheese”)) {
Pizza pizza; pizza = new CheesePizza();
}
pizza = new SimplePizzafactory else if(type.equals(“pepperoni”)) {
.createPizza(type); pizza = new PepperoniPizza();
} else if (type.equals(“clam”)) {
pizza.prepare(); pizza = new ClamPizza();
pizza.bake(); } else if (type.equals(“veggie”)) {
pizza.cut(); pizza = new VeggiePizza();
pizza.box(); }
return pizza; return pizza;
} }
}
We got a Factory !
Another Problem ?
Our factory is a concrete class.

New family of products will require new


Factory.
NY Pizza Factory DC Pizza Factory

public class NYPizzaFactory{ public class DCPizzaFactory{


Pizza createPizza(String item) { Pizza createPizza(String item) {
if (item.equals(“cheese”)) { if (item.equals(“cheese”)) {
return new NYCheesePizza(); return new DCCheesePizza();
} else if (item.equals(“veggie”)) { } else if (item.equals(“veggie”)) {
return new NYVeggiePizza(); return new DCVeggiePizza();
} else if (item.equals(“clam”)) { } else if (item.equals(“clam”)) {
return new NYClamPizza(); return new DCClamPizza();
} else if (item.equals(“pepperoni”)) { } else if (item.equals(“pepperoni”)) {
return new NYPepperoniPizza(); return new DCPepperoniPizza();
} else return null; } else return null;
} }
} }
Another Problem ?
Our factory is a concrete class.

New family of products will require a new


Factory.

New concrete Factory implementation would


lead to change in the client.
Abstract Factory
Abstract Factory - Intent
Provide an interface for creating families of
related or dependent objects without
specifying their concrete classes.
Let's get formal !
●AbstractFactory - declares an interface for operations that create
abstract products.

●ConcreteFactory - implements operations to create concrete


products.

●AbstractProduct - declares an interface for a type of product


objects.

●Product - defines a product to be created by the corresponding


ConcreteFactory; it implements the AbstractProduct interface.

●Client - uses the interfaces declared by the AbstractFactory and


AbstractProduct classes.
Demonstration
Questions ?

You might also like