Head first笔记四:简单工厂 工厂方法 抽象工厂

本文详细介绍了在Java中使用简单工厂、工厂方法和抽象工厂模式实现对象创建的过程,通过实例展示了如何根据需求灵活地创建不同类型的对象,提高了代码的复用性和扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



1. 简单工厂:剥离if/else(case) new对象部分,组成简单工厂。如创建不同的pizza 

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 VeggiePizza();
		}
		return pizza;
	}
}
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 VeggiePizza();
		}
		return pizza;
	}
}

比以下原始方法有改进
Pizza orderPizza(String type) {
	Pizza pizza;
	if (type.equals(“cheese”)) {
		pizza = new CheesePizza();
	} else if (type.equals(“greek”) {
		pizza = new GreekPizza();
	} else if (type.equals(“pepperoni”) {
		pizza = new PepperoniPizza();
	} else if (type.equals(“clam”) {
		pizza = new ClamPizza();
	} else if (type.equals(“veggie”) {
		pizza = new VeggiePizza();
	}
	pizza.prepare();
	pizza.bake();
	pizza.cut();
	pizza.box();
	return pizza;
}

2. 工厂方法

如果有加盟店,会有纽约风味和芝加哥风味cheese批萨,而简单工厂创建的cheese都一个味。

此时可抽象createPizza接口,纽约创建纽约风味的批萨,芝加哥创建芝加哥风味的批萨,此模式即工厂方法

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);
}
public class NYPizzaStore extends PizzaStore {
	Pizza createPizza(String item) {
		if (item.equals(“cheese”)) {
			return new NYStyleCheesePizza();
		} else if (item.equals(“veggie”)) {
			return new NYStyleVeggiePizza();
		} else if (item.equals(“clam”)) {
			return new NYStyleClamPizza();
		} else if (item.equals(“pepperoni”)) {
			return new NYStylePepperoniPizza();
		} else return null;
	}
}
public abstract class Pizza {
	String name;
	String dough;
	String sauce;
	ArrayList toppings = new ArrayList();
	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));
		}
	}
	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”);
	}
	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 = “Chicago 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 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”);
	}
}


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 {
	public Dough createDough() {
		return new ThinCrustDough();
	}
	public Sauce createSauce() {
		return new MarinaraSauce();
	}
	public Cheese createCheese() {
		return new ReggianoCheese();
	}
	public Veggies[] createVeggies() {
		Veggies veggies[] = { new Garlic(), new Onion(), new Mushroom(), new RedPepper() };
		return veggies;
	}
	public Pepperoni createPepperoni() {
		return new SlicedPepperoni();
	}
	public Clams createClam() {
		return new FreshClams();
	}
}


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() {
		// code to print pizza here
	}
}

public class CheesePizza extends Pizza {
	PizzaIngredientFactory ingredientFactory;
	public CheesePizza(PizzaIngredientFactory ingredientFactory) {
		this.ingredientFactory = ingredientFactory;
	}
	void prepare() {
		System.out.println(“Preparing “ + name);
		dough = ingredientFactory.createDough();
		sauce = ingredientFactory.createSauce();
		cheese = ingredientFactory.createCheese();
	}
}
public class ClamPizza extends Pizza {
	PizzaIngredientFactory ingredientFactory;
	public ClamPizza(PizzaIngredientFactory ingredientFactory) {
		this.ingredientFactory = ingredientFactory;
	}
	void prepare() {
		System.out.println(“Preparing “ + name);
		dough = ingredientFactory.createDough();
		sauce = ingredientFactory.createSauce();
		cheese = ingredientFactory.createCheese();
		clam = ingredientFactory.createClam();
	}
}

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”);
		} else if (item.equals(“veggie”)) {
			pizza = new VeggiePizza(ingredientFactory);
			pizza.setName(“New York Style Veggie Pizza”);
		} else if (item.equals(“clam”)) {
			pizza = new ClamPizza(ingredientFactory);
			pizza.setName(“New York Style Clam Pizza”);
		} else if (item.equals(“pepperoni”)) {
			pizza = new PepperoniPizza(ingredientFactory);
			pizza.setName(“New York Style Pepperoni Pizza”);
		}
		return pizza;
	}
}
PizzaStore nyPizzaStore = new NYPizzaStore();
nyPizzaStore.orderPizza(“cheese”);
{
...
	Pizza pizza = createPizza(“cheese”);
		//Pizza pizza = new CheesePizza(nyIngredientFactory);
			//void prepare() {
			dough = factory.createDough();
			sauce = factory.createSauce();
			cheese = factory.createCheese();
			}
	...
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值