每天学一点设计模式-抽象工厂模式
来源:互联网 发布:dbc2000麻痹戒指数据 编辑:程序博客网 时间:2024/04/19 15:11
抽象工厂模式
英文名
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;}@Overridepublic 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;}@Overridepublic 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 {@Overrideprotected 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 PizzaBake for 25 minutes at 350Cutting the pizza into diagonal slicesPlace pizza in official PizzaStore boxEthan ordered a New York Style Cheese Pizza
0 0
- 每天学一点设计模式-抽象工厂模式
- 每天学一点设计模式-工厂方法模式
- 每天一学设计模式之抽象工厂模式
- 每天学一点设计模式-策略模式
- 每天学一点设计模式-观察者模式
- 每天学一点设计模式-命令模式
- 每天学一点设计模式-适配器模式
- 每天学一点设计模式-外观模式
- 每天学一点设计模式-状态模式
- 学点设计模式-抽象工厂模式
- 每天学一点flash(51) 工厂模式
- 每天一个设计模式: 抽象工厂模式(AbstractFactory)
- 每天学一点设计模式-装饰者模式
- 每天学一点设计模式-单例模式
- 每天学一点设计模式-模板方法模式
- 每天一学设计模式之工厂方法模式
- 跟JBPM学设计模式之抽象工厂模式
- 讲故事,学(Java)设计模式—抽象工厂模式
- BZOJ 2038 2009国家集训队 小Z的袜子 莫队算法
- Android 如何隐藏标题栏和通知栏
- 简单入门java多线程<二>:线程状态和属性
- 第十二周oj平台:刑警的射击成绩
- PAT 1043. Is It a Binary Search Tree (25)
- 每天学一点设计模式-抽象工厂模式
- oracle-存储过程练习
- RHEL7精简安装后fuser或ifconfig命令提示command not found
- Android.9图片讲解(二)
- Android 的 Matrix 解析
- Git SSH Key 生成步骤
- JAVA中调用R
- 最常见的5个导致 RAC 实例崩溃的问题
- C#Update批量更新数据