每天学一点设计模式-抽象工厂模式
2014-11-13 17:00
204 查看
抽象工厂模式
英文名
Abstract Factory Pattern定义
提供一个接口,用于创建相关或对象家族,而无需指定具体类原则
要依赖抽象,不要依赖具体类理解
1.相互直接交流的是工厂抽象类,你无需知道他具体的实现类是哪一个。这样就做到了面向抽象工厂类来编程。2.抽象工厂类中定义了产生所有产品的方法。只是每个产品因地域差异而不同,但是都属于某一个类别的产品。这里面产品也要抽象成接口。
3.这个时候我们想要的不同的产品是由工厂子类决定。而这个子类是在动态运行过程中才会知道。编码阶段完全可以不用考虑。我们只要知道,我要的产品,工厂会给我生产出来就完事啦。
代码
抽象工厂接口public interface PizzaIngredientFactory {
public Dough createDough();
public Sauce createSauce();
public Cheese createCheese();
public Veggies[] createVeggies();
public Pepperoni createPepperoni();
public Clams createClam();
}
实现类
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Dough createDough() {
// TODO Auto-generated method stub
return new ThinCrustDough();
}
@Override
public Sauce createSauce() {
// TODO Auto-generated method stub
return new MarinaraSauce();
}
@Override
public Cheese createCheese() {
// TODO Auto-generated method stub
return new ReggianoCheese();
}
@Override
public Veggies[] createVeggies() {
// TODO Auto-generated method stub
Veggies veggies[] = {new Garlic(),new Onion(),new Mushroom(),new RedPepper()};
return veggies;
}
@Override
public Pepperoni createPepperoni() {
// TODO Auto-generated method stub
return new SlicedPepperoni();
}
@Override
public Clams createClam() {
// TODO Auto-generated method stub
return new FreshClams();
}
}
其中用到的实体类接口以及具体实现
/**
* Description:原料,奶酪
*/
public interface Cheese {
}
public class ReggianoCheese implements Cheese { }
/** 原料,蛤蜊 */ public interface Clams { }
public class FreshClams implements Clams { }
/** * Description:原料,面皮 */ public interface Dough { }
public class ThinCrustDough implements Dough { }
/** * Description:原料,蔬菜 */ public interface Veggies { }
public class Garlic implements Veggies { }
public class Mushroom implements Veggies { }
public class Onion implements Veggies { }
public class RedPepper implements Veggies { }
/** * Description:原料,酱汁 */ public interface Sauce { }
public class MarinaraSauce implements Sauce { }
/** * Description:原料,辣香肠 */ public interface Pepperoni { }
public class SlicedPepperoni implements Pepperoni { }
改造上一篇文章的pizza类,
public abstract class Pizza {
String name;
Dough dough;
Sauce sauce;
Veggies veggies[];
Cheese cheese;
Pepperoni pipperoni;
Clams clam;
public abstract void prepare();
public void bake() {
System.out.println("Bake for 25 minutes at 350");
}
public void cut() {
System.out.println("Cutting the pizza into diagonal slices");
}
public void box() {
System.out.println("Place pizza in official PizzaStore box");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
现在不需要有NYStylePizza,直接正对pizza原料产生不同的pizza就行
奶酪pizza
public class CheesePizza extends Pizza {
PizzaIngredientFactory ingredientFactory;
public CheesePizza(PizzaIngredientFactory ingredientFactory) {
this.ingredientFactory = ingredientFactory;
}
@Override
public void prepare() {
System.out.println("Preparing " + name);
dough = ingredientFactory.createDough();
sauce = ingredientFactory.createSauce();
cheese = ingredientFactory.createCheese();
}
}
蛤蜊pizza
public class ClamPizza extends Pizza {
PizzaIngredientFactory ingregientFactory;
public ClamPizza(PizzaIngredientFactory ingregientFactory){
this.ingregientFactory = ingregientFactory;
}
@Override
public void prepare() {
System.out.println("Preparing " + name);
dough = ingregientFactory.createDough();
sauce = ingregientFactory.createSauce();
cheese = ingregientFactory.createCheese();
clam = ingregientFactory.createClam();
}
}
pizza店
public class NYStylePizzaStore extends PizzaStore {
@Override
protected Pizza createPizza(String item) {
Pizza pizza = null;
PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();
if (item.equals("cheese")) {
pizza = new CheesePizza(ingredientFactory);
pizza.setName("New York Style Cheese Pizza");
} else if (item.equals("clam")) {
pizza = new ClamPizza(ingredientFactory);
}
return pizza;
}
}
测试程序
public class PizzaTestDrive {
public static void main(String[] args) {
PizzaStore nyStore = new NYStylePizzaStore();
Pizza pizza = nyStore.orderPizza("cheese");
System.out.println("Ethan ordered a " + pizza.getName() + "\n");
}
}
输出
Preparing New York Style Cheese Pizza
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box
Ethan ordered a New York Style Cheese Pizza
相关文章推荐
- 每天学一点设计模式-命令模式
- 每天学一点设计模式-策略模式
- 每天学一点设计模式-模板方法模式
- 每天学一点设计模式-适配器模式
- 每天一个设计模式: 抽象工厂模式(AbstractFactory)
- 每天学一点设计模式-观察者模式
- 每天学一点设计模式-外观模式
- 每天一个设计模式之 -- 抽象工厂模式
- 每天学一点设计模式-单例模式
- 每天学一点设计模式-状态模式
- 每天学一点设计模式-工厂方法模式
- 每天学一点设计模式-装饰者模式
- 每天一个设计模式(6):抽象工厂模式
- 设计模式笔记-抽象工厂模式
- .NET设计模式:抽象工厂模式(Abstract Factory)
- 设计模式C#描述——抽象工厂模式
- 初学设计模式的一点理解
- C#设计模式编程之抽象工厂模式新解
- 我的设计模式之旅(3)――抽象工厂模式AbstractFactory
- JAVA 23设计模式一点就通