工厂模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。
类图:
话不多说、直接做实例:
需求同上篇简单工厂模式,开一家pizza店,提供四种披萨(可以更多种),pizza店负责订pizza,pizza工厂负责做pizza,现在需要扩展pizza店,就是对于不同地区的pizza店对着四种pizza有不同的口味要求啥的。
类图: 哈哈 画成这样也是gg了。。
1.首先把pizza定义成接口(接口可以是interface和class)
class Pizza{//作为接口 定义做pizza一套流程,具体差异子类实现去重写
//成员变量
String name;//哪种pizza
double price;//价格
String dough;//面团
String sauce;//调料
Pizza pizza ;
public void prepare(){//准备
System.out.println("正在为您准备"+name+"的材料");
}
public void bake(){//烘烤
System.out.println("正在为您烘烤pizza,请稍等半个点。。");
}
public void cut(){//切
System.out.println("正在为您把pizza切块。。");
}
public void box(){//装盒
System.out.println("正在为您将pizza打包装盒。。");
}
public void print(){//打印一下点了啥
System.out.println("您好,您点了"+name+", 一共"+price+"$");
}
}
2.定义那四种pizza
class CheesePizza extends Pizza{//具体pizza类
public CheesePizza(){//芝士pizza
name = "cheesePizza";
price = 3.3;
dough = "面团团团团团";
sauce = "酱酱酱酱酱酱酱";
}
}
class NYCheesePizza extends CheesePizza{//纽约地区商店要芝士pizza来点不同风味 继承了CheesePizza,别忘了CheesePizza是继承pizza的,所以NYCheesePizza 类的对象可以直接定义为pizza类型 向上转型
public NYCheesePizza(){
name = "纽约风味起司pizza";
price = 4.4;
dough = "纽约面团";
sauce = "纽约酱酱酱";
}
}
class ClamPizza extends Pizza{//蛤蜊pizza
public ClamPizza(){
name = "clamPizza";
price = 4.4;
dough = "面团团面团团";
sauce = "酱酱酱酱酱酱";
}
}
class NYClamPizza extends ClamPizza{
public NYClamPizza(){
name = "纽约风味蛤蜊pizza";
price = 4.4;
}
}
class PepperoniPizza extends Pizza{//蒜香pizza
public PepperoniPizza(){
name = "pepperoniPizza";
price = 5.5;
dough = "面团面团";
sauce = "酱紫";
}
}
class NYPepperoniPizza extends PepperoniPizza{
public NYPepperoniPizza(){
name = "纽约蒜香风味pizza";
price = 5.5;
}
}
class VeggiePizza extends Pizza{//蔬菜pizza
public VeggiePizza(){
name = "VeggiePizza";
price = 6.6;
dough = "面main面";
sauce = "酱紫酱紫";
}
}
class NYVeggiePizza extends VeggiePizza{
public NYVeggiePizza(){
name ="纽约蔬菜pizza";
price = 6.6;
}
}
3.定义pizza商店PizzaStore类
abstract class PizzaStore{//使用pizza商店来订pizza
public final Pizza orderPizza(String type){
Pizza pizza;
pizza = createPizza(type); //创建对象这部分拿出去了
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
pizza.print();
return pizza;
}
public abstract Pizza createPizza(String type);//将创建对象封装到抽象方法里让子类去实现,也就是让具体的pizza店决定生成哪种pizza,注意不是子类决定,是有type决定的,子类只是根据type去生成
}
4.现在来写具体商店
//纽约地区pizza店
class NYPizzaStore extends PizzaStore{
public Pizza createPizza(String type){
if(type.equals("cheese")){
return new NYCheesePizza();
}else if (type.equals("veggie")){
return new NYVeggiePizza();
}else if(type.equals("pepperoni")){
return new NYPepperoniPizza();
}else if (type.equals("clam")){
return new NYClamPizza();
}else return null;
}
}
5.好了,去纽约商店订pizza吧
public class test{
public static void main(String args[]){
NYPizzaStore pizza = new NYPizzaStore();
pizza.orderPizza("clam");
System.out.println("---------------------------------------");
pizza.orderPizza("pepperoni");
}
}
运行结果:
正在为您准备纽约风味蛤蜊pizza的材料
正在为您烘烤pizza,请稍等半个点。。
正在为您把pizza切块。。
正在为您将pizza打包装盒。。
您好,您点了纽约风味蛤蜊pizza, 一共4.4$
正在为您准备纽约蒜香风味pizza的材料
正在为您烘烤pizza,请稍等半个点。。
正在为您把pizza切块。。
正在为您将pizza打包装盒。。
您好,您点了纽约蒜香风味pizza, 一共5.5$