关于设计方式的个人小解
发布时间: 2012-12-19 14:13:14 作者: rapoo
关于设计模式的个人小解
一 单例模式: 一个类只能实例化一个具体对象
?
?
二.抽象工厂模式:
-----------------------------------copy other's blog :
NYPizzaFactory nyFactory = new NYPizzaFactory();PizzaStore nyStore = new PizzaStore(nyFactory);nyStore.orderPizza("Veggie");ChicagoPizzaFactory chicagoFactory = new ChicagoPizzaFactory();PizzaStore chicagoStore = new PizzaStore(chicagoFactory);nyStore.orderPizza("Veggie");?
?
public abstract class PizzaStore {public Pizza orderPizza(String type){Pizza pizza;//现在createPizza()方法从工厂对象中移回PizzaStorepizza = createPizza(type);pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}abstract Pizza createPizza(String type);}?
?
public class NYPizzaStore extends PizzaStore {@OverridePizza createPizza(String type) {if(type.equals("cheese")) {return new NYStyleCheesePizza();} else if(type.equals("veggie")) {return new NYStyleVeggiePizza();} else if(type.equals("pepperoni")) {return new NYStylePepperoniPizza();} else {return null;}}}?
?
abstract Product factoryMethod(String type);?
?
import java.util.ArrayList;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();Pizza pizza = nyStore.orderPizza("cheese");System.out.println("Order a " + pizza.getName() + "/n");}}?
?
工厂方法的子类看起来很像简单工厂,但他们却不一样。简单工厂把全部的事情,在一个地方都处理完了,然而工厂方法却是创建一个框架,让子类决定要如何实现。比方说,在工厂方法中,orderPizza()方法提供了一半的框架,以便创建比萨,orderPizza()方法依赖工厂方法创建具体类,并制造出实际的比萨。课通过继承PizzaStore类,决定实际制造出的比萨是什么。简单工厂的做法,可以将对象的创建封装起来,但是简单工厂不具备工厂方法的弹性,因为简单工厂不能变更正在创建的产品。
-------------------------------------------------
以上写的很烂。我也没有细看。总结如下:
1。定义pizzaStore抽象类,定义订单系统OrderPizza(),所有子类均需使用该方法。定义抽象的pizza制作方法createPizza,每个子类可以有自己的制作方法
2.定义Pizza? 抽象类。定义一些方法
3.定义工厂方法
4. 各自子类集成pizzaStore
5. 定义PizzaTestDrive方法,在该方法里面,具体化子类商店,各自不同的子类产生订单
?
--------比较乱!!!!
?
?
?
三. 观察者模式:
GoF说道:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。从这段话里我们可以得到两个信息,如下:
1, 观察者(具体执行操作的对象,有多个)
2, 被观察者(顾名思义是被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操)
参照http://www.iteye.com/topic/102068/。
?
?