zoukankan      html  css  js  c++  java
  • 《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() + "
    ");
    }
    


  • 相关阅读:
    shell命令finger
    join命令
    日志记录
    shell命令xargs
    linux read 简介
    P1601 A+B Problem(高精)
    P2670 [NOIP2015 普及组] 扫雷游戏
    P1042 [NOIP2003 普及组] 乒乓球
    P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
    P5744 【深基7.习9】培训
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5280954.html
Copyright © 2011-2022 走看看