例题:
披萨项目:要方便披萨品种的扩展、要便于维护、要能运行时扩展
简单工厂模式 — 简单工厂模式的设计方案
简单工厂模式的设计方案:定义一个实例化披萨对象的类,封装创建对象的代码
简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为
关键代码:
public class SimplePizzaFactory
{
public Pizza cratePizza(String orderType)
{
Pizza pizza=null;
if(orderType.equals("cheese"))
{
pizza=new CheesePizza();
}
else if (orderType.equals("greek")) {
pizza=new GreekPizza();
}
else if (orderType.equals("pepper"))
{
pizza=new PepperPizza();
}
return pizza;
}
}
工厂方法模式 — 披萨项目新需求的困惑
披萨项目加盟店困惑
工厂方法模式 — 工厂方法模式设计方案
工厂方法模式设计方案:将披萨项目里的披萨对象实例化功能抽象成抽象方法,在不同加盟店具体实现功能。
工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类
关键代码:
public abstract class OrderPizza
{
public OrderPizza() throws IOException
{
Pizza pizza=null;
String orderType;
do
{
orderType=getType();
pizza=createPizza(orderType);
if(pizza!=null)
{
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
} while (true);
}
abstract Pizza createPizza(String orderType);
}
public class LDOrderPizza extends OrderPizza
{
public LDOrderPizza() throws IOException
{
super();
}
@Override
Pizza createPizza(String orderType)
{
Pizza pizza=null;
if(orderType.equals("cheese"))
{
pizza=new LDCheesePizza();
}
else if (orderType.equals("pepper"))
{
pizza=new LDPepperPizza();
}
return pizza;
}
}
抽象工厂模式 — 抽象工厂模式定义
抽象工厂模式:定义了一个接口用于创建相关或有依赖关系的对象族,而无需明确指定具体类
关键code
1. 抽象工厂
public interface AbstractFactory
{
public Pizza createPizza(String orderType);
}
2. 具体的一个工厂
public class LDFactory implements AbstractFactory
{
@Override
public Pizza createPizza(String orderType)
{
Pizza pizza=null;
if(orderType.equals("cheese"))
{
pizza=new LDCheesePizza();
}
else if (orderType.equals("pepper"))
{
pizza=new LDPepperPizza();
}
return pizza;
}
}
3. 实施点披萨动作
public class OrderPizza
{
AbstractFactory abstractFactory;
public OrderPizza(AbstractFactory abstractFactory) throws IOException
{
setFactory(abstractFactory);
}
public void setFactory(AbstractFactory abstractFactory) throws IOException
{
Pizza pizza=null;
String orderType;
this.abstractFactory=abstractFactory;
do
{
orderType=getType();
pizza=abstractFactory.createPizza(orderType);
if(pizza!=null)
{
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
} while (true);
}
private String getType() throws IOException
{
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type please:");
String string=bufferedReader.readLine();
return string;
}
}
4. 入口
public static void main(String[] args)
{
try
{
OrderPizza orderPizza=new OrderPizza(new LDFactory());
}
catch (IOException e)
{
e.printStackTrace();
}
}