4.工厂模式
工厂模式分为工厂方法模式和抽象工厂模式
public abstract class PizzaStore {public Pizza orderPizza(String type){Pizza pizza;pizza=createPizza(type);pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}protected abstract Pizza createPizza(String type);
}
public class NYPizzaStore extends PizzaStore {public Pizza createPizza(String type){if(type.equals("cheese")){return new NYStyleCheesePizza();} //还可以根据需要返回不同的Pizzaelse return null;}
}
public class ChicagoPizzaStore extends PizzaStore {public Pizza createPizza(String type){if(type.equals("cheese")){return new ChicagoStyleCheesePizza();}//还可以根据需要返回不同的Pizzaelse return null;}
}
public abstract class Pizza {String name;String dough;String sauce;ArrayList<String> toppings = new ArrayList<String>();void prepare() {System.out.println("Preparing" + name);System.out.println("");System.out.println("");for (String s : toppings) {System.out.println(" " + s);}}void bake(){System.out.println("Bake for 25 minutes at 350");}void cut(){System.out.println("Cutting the pizza into diagonal slices");}void box(){System.out.println("Place puzza in official PizzaStore box");}public String getName(){return name;}
}
public class NYStyleCheesePizza extends Pizza {public NYStyleCheesePizza(){name="NY Style Sauce and Cheese Pizza";dough="Thin Crust Dough";sauce="Marinara Sauce";toppings.add("Grated Reggiano Cheese");}
}
public class ChicagoStyleCheesePizza extends Pizza {public ChicagoStyleCheesePizza(){name="Chicage Style Deep Dish Cheese Pizza";dough="Extra Thick Crust Dough";sauce="Plum Tomato Sauce";toppings.add("Shredded Mozzarella Cheese");}void cut(){System.out.println("Cutting the pizza into square slices");}
}
测试:
public class PizzaTestDrive {public static void main(String[] args){PizzaStore nyStore=new NYPizzaStore();PizzaStore chicagoStore=new ChicagoPizzaStore();Pizza pizzaderPizza("cheese");System.out.println("Ethan ordered a "Name()+"n");pizzaderPizza("cheese");System.out.println("Joel ordered a "Name()+"n");}
}
结果: PreparingNY Style Sauce and Cheese Pizza
Grated Reggiano Cheese
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place puzza in official PizzaStore box
Ethan ordered a NY Style Sauce and Cheese PizzaPreparingChicage Style Deep Dish Cheese Pizza
Shredded Mozzarella Cheese
Bake for 25 minutes at 350
Cutting the pizza into square slices
Place puzza in official PizzaStore box
Joel ordered a Chicage Style Deep Dish Cheese Pizza
protected abstract Pizza createPizza(String type);
负责实例化比萨的责任,此方法就如同是一个“工厂”。
工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样,客户程序中关于超类的代码就和子类对象创建代码解耦了。
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 {@Overridepublic Dough createDough() {// TODO Auto-generated method stubreturn new ThinCrustDough();}@Overridepublic Sauce createSauce() {// TODO Auto-generated method stubreturn new marinaraSauce();}@Overridepublic Cheese createCheese() {// TODO Auto-generated method stubreturn new ReggianoCheese();}@Overridepublic Veggies[] createVeggies() {// TODO Auto-generated method stubVeggies[] veggies={new Garlic(),new Onion(),new Mushroom(),new RedPepper()}return veggies;}@Overridepublic Pepperoni createPepperoni() {// TODO Auto-generated method stubreturn new SlicedPepperoni();}@Overridepublic Clams createClam() {// TODO Auto-generated method stubreturn new FreshClams();}
}
public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {@Overridepublic Dough createDough() {// TODO Auto-generated method stubreturn new ThickCrustDough();}@Overridepublic Sauce createSauce() {// TODO Auto-generated method stubreturn new PlumTomatoSauce();}@Overridepublic Cheese createCheese() {// TODO Auto-generated method stubreturn new Mozzarella();}@Overridepublic Veggies[] createVeggies() {// TODO Auto-generated method stubVeggies[] veggies={new BlackOlives(),new Spinach(),new EggPlant()}return veggies;}@Overridepublic Pepperoni createPepperoni() {// TODO Auto-generated method stubreturn new SlicedPepperoni;}@Overridepublic Clams createClam() {// TODO Auto-generated method stubreturn new FrozenClams();}
}
public abstract class Pizza {String name;Dough dough;Sauce sauce;Veggies[] veggies;Cheese cheese;Pepperoni pepperoni;Clams clam;abstract void prepare();void bake(){System.out.println("Bake for 25 minutes at 350");}void cut(){System.out.println("Cutting the pizza into diagonal slices");}void box(){System.out.println("Place puzza in official PizzaStore box");}public void setName(String name){this.name=name;}public String getName(){return name;}public String toString(){//这里是打印Pizza的代码}
}
public class CheesePizza extends Pizza {PizzaIngredientFactory ingredientFactory;public CheesePizza(PizzaIngredientFactory ingredientFactory){this.ingredientFactory=ingredientFactory;}@Overridevoid prepare() {// TODO Auto-generated method stubSystem.out.println("Preparing" + name);doughateDough();sauceateSauce();cheeseateCheese();}}
*Pizza的代码利用相关的工厂生产原料。所生产的原料依赖所使用的工厂,Pizza类根本不关心这些原料,它只知道如何制作比萨。Pizza和区域原料之间被解耦。 sauceateSauce();
sauce:把Pizza的实例变量设置为此比萨所使用的某种酱料。
ingredientFactory:这是原料工厂,Pizza不在乎使用什么工厂,只要是原料工厂就行了。
createSauce():此方法会返回这个区域所使用的酱料。
同样,可得到蛤蜊比萨:
public class ClamPizza extends Pizza {PizzaIngredientFactory ingredientFactory;public ClamPizza(PizzaIngredientFactory ingredientFactory){this.ingredientFactory=ingredientFactory;}@Overridevoid prepare() {// TODO Auto-generated method stubSystem.out.println("Preparing"+name);doughateDough();sauceateSauce();cheeseateCheese();clamateClam();}
}
现在只要确认一下加盟店已经使用了正确的比萨并已经和本地的原料工厂搭上线:
public class NYPizzaStore extends PizzaStore {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");}return pizza;}
}
public abstract class Dough {
}
public abstract class Sauce {
}
public abstract class Veggies {
}
public abstract class Cheese {
}
public abstract class Pepperoni {
}
public abstract class Clams {
}
public class BlackOlives extends Veggies {
}
public class CheesePizza extends Pizza {
PizzaIngredientFactory ingredientFactory;
public CheesePizza(PizzaIngredientFactory ingredientFactory){
this.ingredientFactory=ingredientFactory;
}
@Override
void prepare() {
// TODO Auto-generated method stub
System.out.println("Preparing" + name);
doughateDough();
sauceateSauce();
cheeseateCheese();
}}
public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory { @Override
public Dough createDough() {
// TODO Auto-generated method stub
return new ThickCrustDough();
} @Override
public Sauce createSauce() {
// TODO Auto-generated method stub
return new PlumTomatoSauce();
} @Override
public Cheese createCheese() {
// TODO Auto-generated method stub
return new Mozzarella();
} @Override
public Veggies[] createVeggies() {
// TODO Auto-generated method stub
Veggies[] veggies={new BlackOlives(),new Spinach(),new EggPlant()};
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 FrozenClams();
}
}
public class ChicagoPizzaStore extends PizzaStore {
protected Pizza createPizza(String item){
Pizza pizza=null;
PizzaIngredientFactory ingredientFactory=new ChicagoPizzaIngredientFactory();
if(item.equals("cheese")){
pizza=new CheesePizza(ingredientFactory);
pizza.setName("Chicago Style Cheese Pizza");
}
return pizza;
}
}
public class ClamPizza extends Pizza {PizzaIngredientFactory ingredientFactory;public ClamPizza(PizzaIngredientFactory ingredientFactory){ this.ingredientFactory=ingredientFactory;}
@Override
void prepare() {
// TODO Auto-generated method stub
System.out.println("Preparing"+name);
doughateDough();
sauceateSauce();
cheeseateCheese();
clamateClam();
}
}
public class EggPlant extends Veggies {
}
public class FreshClams extends Clams {
}
public class FrozenClams extends Clams {
}
public class Garlic extends Veggies {
}
public class MarinaraSauce extends Sauce {
}
public class Mozzarella extends Cheese {
}
public class Mushroom extends Veggies {
}
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();
}
}
public class NYPizzaStore extends PizzaStore {
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");
}
return pizza;
}
}
public class Onion extends Veggies {
}
public abstract class Pizza {
String name;
Dough dough;
Sauce sauce;
Veggies[] veggies;
Cheese cheese;
Pepperoni pepperoni;
Clams clam;
abstract void prepare();
void bake(){
System.out.println("Bake for 25 minutes at 350");
}
void cut(){
System.out.println("Cutting the pizza into diagonal slices");
}
void box(){
System.out.println("Place puzza in official PizzaStore box");
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public String toString(){
//这里是打印Pizza的代码
String();
}
}
public interface PizzaIngredientFactory {
public Dough createDough();
public Sauce createSauce();
public Cheese createCheese();
public Veggies[] createVeggies();
public Pepperoni createPepperoni();
public Clams createClam();
//每个原料都是一个类
}
public abstract class PizzaStore {
public Pizza orderPizza(String type){
Pizza pizza;
pizza=createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(String type);
}
public class PlumTomatoSauce extends Sauce {
}
public class RedPepper extends Veggies {
}
public class ReggianoCheese extends Cheese {
}
public class SlicedPepperoni extends Pepperoni {
}
public class Spinach extends Veggies {
}
public class ThickCrustDough extends Dough {
}
public class ThinCrustDough extends Dough {
}
测试: public class PizzaTestDrive {public static void main(String[] args){PizzaStore nyStore=new NYPizzaStore();PizzaStore chicagoStore=new ChicagoPizzaStore();Pizza pizzaderPizza("cheese");System.out.println("Ethan ordered a "Name()+"n");pizzaderPizza("cheese");System.out.println("Joel ordered a "Name()+"n");}
}
结果: PreparingNew York Style Cheese Pizza
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place puzza in official PizzaStore box
Ethan ordered a New York Style Cheese PizzaPreparingChicago Style Cheese Pizza
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place puzza in official PizzaStore box
Joel ordered a Chicago Style Cheese Pizza
*结果虽然和之前类似,但是内在实现的方式是不同的。
本文发布于:2024-02-05 07:07:38,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170727011264275.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |