设计模式学习--工厂模式(Factory Pattern)(1)

项目结构:

源代码:

/Pizza.java

package pizzas;

import java.util.ArrayList;

/***

  • 抽象pizza类

  • @author wwj

*/

abstract public class Pizza {

String name;

String dough;

String sauce;

ArrayList toppings = new ArrayList();

public String getName() {

return name;

}

@Override

public String toString() {

StringBuffer display = new StringBuffer();

display.append(“----” + name + “----\n”);

display.append(dough + “\n”);

display.append(sauce + “\n”);

for(int i = 0; i < toppings.size(); i++) {

display.append((String)toppings.get(i) + “\n”);

}

return display.toString();

}

//准备

public void prepare() {

System.out.println("Preparing " + name);

}

//烘烤

public void bake() {

System.out.println("Baking " + name);

}

//切片

public void cut() {

System.out.println("Cutting " + name);

}

//装箱

public void box() {

System.out.println("Boxing " + name);

}

}

package pizzas;

/**

  • 2013/5/25

  • @author wwj

*/

public class CheesePizza extends Pizza {

@SuppressWarnings(“unchecked”)

public CheesePizza() {

name = “Cheese Pizza”;

dough = “Regular Crust”;

sauce = “Marinara Pizza Sauce”;

toppings.add(“Fresh Mozzarella”);

toppings.add(“Parmesan”);

}

}

package pizzas;

/**

  • 2013/5/25

  • @author wwj

*/

public class ClamPizza extends Pizza {

@SuppressWarnings(“unchecked”)

public ClamPizza() {

name = “Clam Pizza”;

dough = “Thin crust”;

sauce = “White garlic sauce”;

toppings.add(“Clams”);

toppings.add(“Grated parmesan cheese”);

}

}

package pizzas;

/**

  • 2013/5/25

  • @author wwj

*/

public class PepperoniPizza extends Pizza {

@SuppressWarnings(“unchecked”)

public PepperoniPizza() {

name = “Pepperoni Pizza”;

dough = “Crust”;

sauce = “Marinara sauce”;

toppings.add(“Sliced Pepperoni”);

toppings.add(“Sliced Onion”);

toppings.add(“Grated parmesan cheese”);

}

}

package pizzas;

/**

  • 素食pizza

  • @author wwj

*/

public class VegglePizza extends Pizza {

@SuppressWarnings(“unchecked”)

public VegglePizza(){

name = “Veggie Pizza”;

dough = “Crust”;

sauce = “Marinara sauce”;

toppings.add(“Shredded mozzarella”);

toppings.add(“Grated parmesan”);

toppings.add(“Diced onion”);

toppings.add(“Sliced mushrooms”);

toppings.add(“Sliced red pepper”);

toppings.add(“Sliced black olives”);

}

}

/SimplePizzaFactory.java

package pizzas;

/**

  • 2013/5/27

  • @author wwj

  • 简单工厂方法

*/

public class SimplePizzaFactory {

public Pizza createPizza(String type) {

Pizza pizza = null;

if(type.equals(“cheese”)) {

pizza = new CheesePizza();

} else if(type.equals(“pepperoni”)) {

pizza = new PepperoniPizza();

} else if(type.equals(“clam”)) {

pizza = new ClamPizza();

} else if(type.equals(“veggie”)) {

pizza = new VegglePizza();

}

return pizza;

}

}

/PizzaStore

package pizzas;

public class PizzaStore {

SimplePizzaFactory factory;

public PizzaStore(SimplePizzaFactory factory) {

this.factory = factory;

}

public Pizza orderPizza(String type) {

Pizza pizza;

pizza = factory.createPizza(type);

pizza.prepare(); //准备

pizza.bake(); //烘烤

pizza.cut(); //切片

pizza.box(); //装盒

return pizza;

}

}

/PizzaTestDriver

package pizzas;

/**

  • 2013/5/25

  • @author wwj

  • 简单工厂的测试类

*/

public class PizzaTestDriver {

public static void main(String[] args) {

SimplePizzaFactory factory = new SimplePizzaFactory();

PizzaStore store = new PizzaStore(factory);

Pizza pizza = store.orderPizza(“cheese”);

System.out.println("We ordered a " + pizza.getName() + “\n”);

pizza = store.orderPizza(“veggie”);

System.out.println("We ordered a " + pizza.getName() + “\n”);

}

}

工厂方法模式实现


项目结构:

/Pizza.java

把Pizza声明为抽象的,让所有具体比萨都必须派生自这个类。

package pizzafm;

import java.util.ArrayList;

/**

  • 2013/5/25

  • @author wwj

*/

public abstract class Pizza {

String name; //名称

String dough; //面团类型

String sauce; //一套佐料

ArrayList toppings = new ArrayList();

public void prepare() {

System.out.println("Preparing " + name);

System.out.println(“Tossing dough…”);

System.out.println(“Adding sauce…”);

System.out.println("Adding toppings: ");

for(int i = 0; i < toppings.size(); i++) {

System.out.println(" " + toppings.get(i));

}

}

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;

}

}

package pizzafm;

/**

  • 纽约披萨

  • @author wwj

*/

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”);

}

}

package pizzafm;

public class NYStyleClamPizza extends Pizza {

public NYStyleClamPizza() {

name = “NY Style Clam Pizza”;

dough = “Thin Crust Dough”;

sauce = “Marinara Sauce”;

toppings.add(“Grated Reggiano Cheese”);

toppings.add(“Fresh Clams from Long Island Sound”);

}

}

package pizzafm;

public class NYStylePepperoniPizza extends Pizza {

public NYStylePepperoniPizza() {

name = “NY Style Pepperoni Pizza”;

dough = “Thin Crust Dough”;

sauce = “Marinara Sauce”;

toppings.add(“Grated Reggiano Cheese”);

toppings.add(“Sliced Pepperoni”);

toppings.add(“Garlic”);

toppings.add(“Onion”);

toppings.add(“Mushrooms”);

toppings.add(“Red Pepper”);

}

}

package pizzafm;

public class NYStyleVeggiePizza extends Pizza {

public NYStyleVeggiePizza() {

name = “NY Style Veggie Pizza”;

dough = “Thin Crust Dough”;

sauce = “Marinara Sauce”;

toppings.add(“Grated Reggiano Cheese”);

toppings.add(“Garlic”);

toppings.add(“Onion”);

toppings.add(“Mushrooms”);

toppings.add(“Red Pepper”);

}

}

package pizzafm;

/**

  • 芝加哥披萨

  • @author wwj

*/

public class ChicagoStyleCheesePizza extends Pizza {

public ChicagoStyleCheesePizza() {

name = “Chicago Style Deep Dish Cheese Pizza”;

dough = “Extra Thick Crust Dough”;

sauce = “Plum Tomato Sauce”;

toppings.add(“Shredded Mozzarella Cheese”);

}

public void cut() {

System.out.println(“Cutting the pizza into square slices”);

}

}

package pizzafm;

public class ChicagoStyleClamPizza extends Pizza {

public ChicagoStyleClamPizza() {

name = “Chicago Style Clam Pizza”;

dough = “Extra Thick Crust Dough”;

sauce = “Plum Tomato Sauce”;

toppings.add(“Shredded Mozzarella Cheese”);

toppings.add(“Frozen Clams from Chesapeake Bay”);

}

public void cut() {

System.out.println(“Cutting the pizza into square slices”);

}

}

package pizzafm;

public class ChicagoStylePepperoniPizza extends Pizza {

public ChicagoStylePepperoniPizza() {

name = “Chicago Style Pepperoni Pizza”;

dough = “Extra Thick Crust Dough”;

sauce = “Plum Tomato Sauce”;

toppings.add(“Shredded Mozzarella Cheese”);

toppings.add(“Black Olives”);

toppings.add(“Spinach”);

toppings.add(“Eggplant”);

toppings.add(“Sliced Pepperoni”);

}

public void cut() {

System.out.println(“Cutting the pizza into square slices”);

}

}

package pizzafm;

public class ChicagoStyleVeggiePizza extends Pizza {

public ChicagoStyleVeggiePizza() {

name = “Chicago Deep Dish Veggie Pizza”;

dough = “Extra Thick Crust Dough”;

sauce = “Plum Tomato Sauce”;

toppings.add(“Shredded Mozzarella Cheese”);

toppings.add(“Black Olives”);

toppings.add(“Spinach”);

toppings.add(“Eggplant”);

}

public void cut() {

System.out.println(“Cutting the pizza into square slices”);

}

}

/PizzaStore.java

此类也是声明为抽象的,实例化比萨的责任由具体的子类来实现

package pizzafm;

/**

  • 2013/5/25

  • @author wwj

  • 让PizzaStore作为超类,让每个域类型都继承这个PizzaStore,每个子类各自决定如何制造披萨

*/

public abstract class PizzaStore {

public Pizza orderPizza(String type) {

Pizza pizza;

pizza = createPizza(type);

pizza.prepare();

pizza.bake();

pizza.cut();

pizza.box();

return pizza;

}

abstract Pizza createPizza(String type);

}

package pizzafm;

public class NYPizzaStore extends PizzaStore {

@Override

Pizza createPizza(String type) {

if(type.equals(“cheese”)){

return new NYStyleCheesePizza();

} else if(type.equals(“veggie”)) {

return new NYStyleVeggiePizza();

} else if(type.equals(“clam”)) {

return new NYStyleClamPizza();

} else if(type.equals(“pepperoni”)){

return new NYStylePepperoniPizza();

} else return null;

}

}

package pizzafm;

public class ChicagoPizzaStore extends PizzaStore {

@Override

Pizza createPizza(String type) {

if(type.equals(“cheese”)) {

return new ChicagoStyleCheesePizza();

} else if(type.equals(“veggie”)) {

return new ChicagoStyleVeggiePizza();

} else if(type.equals(“clam”)) {

return new ChicagoStyleClamPizza();

} else return null;

}

}

/PizzaTestDriver.java

package pizzafm;

/**

  • 2013/5/25

  • @author wwj

  • 工厂模式测试驱动类

*/

public class PizzaTestDriver {

public static void main(String[] args) {

//首先建立不同的店

PizzaStore nyStore = new NYPizzaStore();

PizzaStore chicagoStore = new ChicagoPizzaStore();

Pizza pizza = nyStore.orderPizza(“cheese”);

System.out.println("Ethan ordered a " + pizza.getName() + “\n”);

pizza = chicagoStore.orderPizza(“cheese”);

System.out.println("Joel ordered a " + pizza.getName() + “\n”);

}

}

抽象工厂模式实现


/Pizza.java

package pizzaaf;

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 pizza in official PizzaStore box”);

}

void setName(String name) {

this.name = name;

}

String getName() {

return name;

}

public String toString() {

StringBuffer result = new StringBuffer();

result.append(“---- " + name + " ----\n”);

if (dough != null) {

result.append(dough);

result.append(“\n”);

}

if (sauce != null) {

result.append(sauce);

result.append(“\n”);

}

if (cheese != null) {

result.append(cheese);

result.append(“\n”);

}

if (veggies != null) {

for (int i = 0; i < veggies.length; i++) {

result.append(veggies[i]);

if (i < veggies.length-1) {

result.append(", ");

}

}

result.append(“\n”);

}

if (clam != null) {

result.append(clam);

result.append(“\n”);

}

if (pepperoni != null) {

result.append(pepperoni);

result.append(“\n”);

}

return result.toString();

}

}

package pizzaaf;

public class CheesePizza extends Pizza {

PizzaIngredientFactory ingredientFactory;

public CheesePizza(PizzaIngredientFactory ingredientFactory) {

this.ingredientFactory = ingredientFactory;

}

@Override

void prepare() {

System.out.println("Preparing " + name);

dough = ingredientFactory.createDough();

sauce = ingredientFactory.createSauce();

cheese = ingredientFactory.createCheese();

}

}

package pizzaaf;

public class ClamPizza extends Pizza {

PizzaIngredientFactory ingredientFactory;

public ClamPizza(PizzaIngredientFactory ingredientFactory) {

this.ingredientFactory = ingredientFactory;

}

@Override

void prepare() {

System.out.println("PreParing " + name);

dough = ingredientFactory.createDough();

sauce = ingredientFactory.createSauce();

cheese = ingredientFactory.createCheese();

clam = ingredientFactory.createClam();

}

}

package pizzaaf;

public class PepperoniPizza extends Pizza {

PizzaIngredientFactory ingredientFactory;

public PepperoniPizza(PizzaIngredientFactory ingredientFactory) {

this.ingredientFactory = ingredientFactory;

}

void prepare() {

System.out.println("Preparing " + name);

dough = ingredientFactory.createDough();

sauce = ingredientFactory.createSauce();

cheese = ingredientFactory.createCheese();

veggies = ingredientFactory.createVeggies();

pepperoni = ingredientFactory.createPepperoni();

}

}

package pizzaaf;

public class VeggiePizza extends Pizza {

PizzaIngredientFactory ingredientFactory;

public VeggiePizza(PizzaIngredientFactory ingredientFactory) {

this.ingredientFactory = ingredientFactory;

}

void prepare() {

System.out.println("Preparing " + name);

dough = ingredientFactory.createDough();

sauce = ingredientFactory.createSauce();

cheese = ingredientFactory.createCheese();

veggies = ingredientFactory.createVeggies();

}

}

/PizzaIngredientFactory.java

package pizzaaf;

/**

  • 建造原料工厂

  • @author wwj

  • 在接口中,每个原料都有一个对应的方法创造该原料

*/

public interface PizzaIngredientFactory {

public Dough createDough();

public Sauce createSauce();

public Cheese createCheese();

public Veggies[] createVeggies();

public Pepperoni createPepperoni();

public Clams createClam();

}

package pizzaaf;

/**

  • 创建纽约原料工厂

  • @author wwj

*/

public class NYPizzaIngredientFactory implements PizzaIngredientFactory {

@Override

public Dough createDough() {

return new ThinCrustDough();

}

@Override

public Sauce createSauce() {

return new MarinaraSauce();

}

@Override

public Cheese createCheese() {

return new ReggianoCheese();

}

@Override

public Veggies[] createVeggies() {

Veggies veggies[] = {new Garlic(), new Onion(), new MushRoom(), new RedPepper()};

return veggies;

}

总结

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

【Android高级架构视频学习资源】

Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
auce();

cheese = ingredientFactory.createCheese();

veggies = ingredientFactory.createVeggies();

}

}

/PizzaIngredientFactory.java

package pizzaaf;

/**

  • 建造原料工厂

  • @author wwj

  • 在接口中,每个原料都有一个对应的方法创造该原料

*/

public interface PizzaIngredientFactory {

public Dough createDough();

public Sauce createSauce();

public Cheese createCheese();

public Veggies[] createVeggies();

public Pepperoni createPepperoni();

public Clams createClam();

}

package pizzaaf;

/**

  • 创建纽约原料工厂

  • @author wwj

*/

public class NYPizzaIngredientFactory implements PizzaIngredientFactory {

@Override

public Dough createDough() {

return new ThinCrustDough();

}

@Override

public Sauce createSauce() {

return new MarinaraSauce();

}

@Override

public Cheese createCheese() {

return new ReggianoCheese();

}

@Override

public Veggies[] createVeggies() {

Veggies veggies[] = {new Garlic(), new Onion(), new MushRoom(), new RedPepper()};

return veggies;

}

总结

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
[外链图片转存中…(img-9byGKonU-1715394469983)]

【Android高级架构视频学习资源】

Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值