《Head First 设计模式》学习笔记——工厂模式 + 抽象工厂模式

设计模式
工厂模式:定义一个创建对象的接口,但由子类决定要实例化的是哪一个。工厂方法让类把实例化推迟到子类。
所谓的“决定”,并非指模式同意子类本身在执行时做决定,而是指在编写创建者类时。不须要知道实际创建的产品是哪一个。

选择了使用这个子类,就自然的决定了实际创建的产品是什么。


抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族。而不须要指定详细类。
抽象工厂的任务时定义一个负责创建一组产品的接口。这个接口内的每一个产品都负责创建一个详细产品。使用工厂方法。


设计原则
(1)多用组合,少用继承
(2)针对接口编程,不针对实现编程
(3)为交互对象之间的松耦合设计而努力
(4)类应该对扩展开放,对改动关闭
(5)依赖倒用原则:要依赖抽象,不要依赖详细类。
不能让高层组件依赖底层组件。并且。无论是高层或低层。两者都应该依赖于抽象。
指导方针:
变量不能够持有详细类的引用(假设使用new,能够改用工厂来避开这样做法);
不要让类派生自详细类(派生自一个接口或者抽象类);
不要覆盖基类中已实现的方法(积累中已经实现的方法。应该有全部子类共享)

要点
全部的工厂都是用来封装对象的创建的。
工厂方法使用继承:把对象的创建托付给子类,子类实现工厂方法来创建对象。
抽象工厂使用对象组合:对象的创建被实如今工厂接口所暴露的方法中。
工厂方法同意将实例化延迟到子类进行。

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 String toString() {
		StringBuffer display = new StringBuffer();
		display.append("---- " + name + " ----
");
		display.append(dough + "
");
		display.append(sauce + "
");
		for (int i = 0; i < toppings.size(); i++) {
			display.append((String )toppings.get(i) + "
");
		}
		return display.toString();
	}
}

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 abstract class PizzaStore {
 
	abstract Pizza createPizza(String item);
 
	public Pizza orderPizza(String type) {
		//创建对象的接口
		Pizza pizza = createPizza(type);
		System.out.println("--- Making a " + pizza.getName() + " ---");
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}
}

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 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() + "
");
 
		pizza = chicagoStore.orderPizza("cheese");
		System.out.println("Joel ordered a " + pizza.getName() + "
");
}


原文地址:https://www.cnblogs.com/lcchuguo/p/5280954.html