您的位置:首页 > 其它

每天学一点设计模式-抽象工厂模式

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: