一 单例模式: 一个类只能实例化一个具体对象
二.抽象工厂模式:
-----------------------------------copy other's blog :
你的比萨店经营有成,击败了竞争者,现在大家都希望比萨店能在自家附近有加盟店。身为加盟公司经营者,你希望确保加盟店营运的质量,因为砸牌子砸的是你的牌子,所以你希望这些店都使用你那些经过时间考验的代码 ,好让比萨的流程一成不变。但是区域的差异呢?每家加盟店都可能想要提供不同风味的比萨,这受到了开店地点及该地区比萨美食家口味的影响。
我们利用SimplePizzaFactory,写出三种不同的工厂,分别是NYPizzaFactory、ChicagoPizzaFactory、CaliforniaPizzaFactory,那么各地的加盟店都有合适的工厂可以用,这是一种办法,让我们看看会变成什么样子:
- NYPizzaFactory nyFactory = new NYPizzaFactory();
-
PizzaStore nyStore = new PizzaStore(nyFactory);
-
nyStore.orderPizza("Veggie");
-
-
ChicagoPizzaFactory chicagoFactory = new ChicagoPizzaFactory();
-
PizzaStore chicagoStore = new PizzaStore(chicagoFactory);
-
nyStore.orderPizza("Veggie");
在推广SimpleFactory时,你发现加盟店的确是采用你的工厂创建比萨,但是其他部分呢,却开始采用他们自创的流程:烘烤的做法有些差异、不要切片、使用其他厂商的盒子。我们只需要管加盟店是卖比萨的,我们不需要了解他卖的是什么样比萨,是怎么样做的这种比萨。在我们稍早的SimplePizzaFactory代码之前,制作比萨的代码绑在PizzaStore里,但这么做却没有弹性。有个做法可以让比萨制作活动局限于PizzaStore类,而同时又能让这些加盟店依然可以自由地制作该区域的风味。所要做的事就是把createPizza()方法放回到PizzaStore中,不过要把它设置成抽象方法,然后为每个区域风味创建一个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);
- }
现在已经有一个PizzaStore作为超类;让每个域类型(NYPizzaFactory、ChicagoPizzaFactory、CaliforniaPizzaFactory)都继承这个PizzaStore,每个子类各自决定如何制作比萨。别忘了,PizzaStore已经有一个不错的订单系统,由OrderPizza()方法负责处理订单,而你希望所有加盟店对于订单的处理都能一致。各个区域比萨店之间的差异在于他们制作比萨的风味,做法如下:
让我们来开加盟店吧,这是纽约风味的:
- 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("pepperoni")) {
-
return new NYStylePepperoniPizza();
-
} else {
-
return null;
- }
- }
- }
上面的代码是对工厂方法的实现,工厂方法即抽象的PizzaStore类,让我们靠近一点观察工厂方法,
- abstract Product factoryMethod(String type);
根据上面可以看出,工厂方法是抽象的,所以依赖子类来处理对象的创建。工厂方法必须返回一个产品。超类中定义的方法,通常使用到工厂方法的返回值。工厂方法将客户(也就是超类中的代码,例如orderPizza())和实际创建具体产品的代码分隔开来。刚刚忽略了一件事:比萨本身!如果没有比萨可出售,我们的比萨店开得再多也不行,现在让我们来实现比萨:
- 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/。
分享到:
相关推荐
**设计模式——抽象工厂之小解** 在软件工程中,设计模式是一种被广泛采用的解决常见问题的经验总结,它们是经过验证的、可重用的解决方案。抽象工厂(Abstract Factory)设计模式是其中的一种创建型模式,它提供了...
VisualC 实效编程 38 小解霸――VCD典型控制VisualC 实效编程 38 小解霸――VCD典型控制VisualC 实效编程 38 小解霸――VCD典型控制VisualC 实效编程 38 小解霸――VCD典型控制VisualC 实效编程 38 小解霸――VCD...
"小解+优化GUI+最终版"这个标题暗示了一个关于GUI改进的项目已经进入了最后阶段,可能是一个软件或应用的更新,重点在于提高用户界面的效率和美观度。 GUI优化通常涉及以下几个方面: 1. **界面设计**:优化GUI的...
【小解霸】是一款专为初学者设计的VCD(Video Compact Disc)播放与控制软件,尤其适合于那些对计算机编程有一定兴趣但经验不足的“菜鸟”用户进行学习和实践。这个实例35主要讲解了如何通过编程实现VCD的典型控制...
VC++ 小解霸 VCD典型播放控制 VC++小解霸――VCD典型播放控制,模仿早期的Windows Media Player播放器,它只能播放DAT格式的文件 ,这种文件是VCD格式,因此这个播放器主要是用来播放VCD的,界面也挺老的,但很经典...
框架(frames)允许在一个网页中显示多个独立的内容区域,但现代网页设计中已经较少使用,因为它们不利于响应式布局和搜索引擎优化。框架由`<frameset>`、`<frame>`和`<noframes>`标签定义。 至于样式属性,如`...
策略路由详细介绍,希望对大家有些帮助,敬请参考,谢谢大家支持!
MeasureSpec是衡量尺寸的工具,包含了尺寸模式(EXACTLY, AT_MOST, UNSPECIFIED)和具体尺寸值。在`onMeasure()`中,开发者需要根据MeasureSpec来设置View的测量宽度和高度。 四、 Layout过程 在measure之后,是...
"echo命令小解" echo命令是一种常用的DOS命令,它主要功能简单点说就是开启或关闭批处理命令行显示在屏幕上。它是批文件的令,属于内部命令内部命令就是常驻于内存的命令,在任意路径下输入均执行。 echo命令的...
【QTP小解——自动化测试基础】 自动化测试是软件测试领域的一种重要手段,它通过预设的脚本和工具来自动执行测试用例,从而节省人力、提高效率和测试覆盖率。QuickTest Professional(QTP)是一款由HP公司开发的...
【连接池小解】 连接池是现代Web应用中不可或缺的一部分,尤其在处理高并发和大量数据库交互场景下,它的作用尤为显著。连接池的核心概念在于有效地管理和复用数据库连接,从而提高系统的性能和稳定性。 在Java中...
### div弹出层position属性小解 在网页布局与设计中,`position` 属性是 CSS 中一个非常重要的属性,它决定了元素如何在页面中定位。对于创建弹出层、模态框等交互式组件来说,正确理解并使用 `position` 属性至关...
该错误代码表示操作过程中发生了某种未定义的行为,通常与程序设计缺陷有关。 ### 7 0x00000007 权限无效 此错误表明用户试图执行的操作没有相应的权限支持,或者权限配置出现了问题。 ### 8 0x00000008 存储空间...
- `{ action }`: 动作,当模式匹配成功时执行的操作。 - `file`: 需要处理的文件名。 #### 三、内置变量 AWK提供了许多内置变量来帮助处理文本,包括: - `ARGC`:命令行参数的数量(不包括程序名称)。 - `ARGV`...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统API、利用硬件特性、或者集成已有的C/C++库。...
- `forgotPattern()`:当用户忘记解锁模式时,此方法被调用。 - `isSecure()`:判断是否需要PIN等安全措施来解锁设备。 - `isVerifyUnlockOnly()`:检查当前是否仅需验证用户能通过锁屏,而无需进行完全解锁。 -...
### Invalidate() 函数详解 #### 一、函数简介 `Invalidate()` 是Windows编程中一个非常重要的函数,主要用于控制窗口的重绘行为。该函数可以让应用程序通知系统某个窗口或者其部分区域需要重新绘制。...
### Java运行环境(JRE)详解 #### 一、概述 Java作为一门广泛应用于服务器端、桌面应用以及移动设备等领域的编程语言,其运行环境尤为重要。本文将深入探讨Java运行环境(JRE)的相关概念,包括JRE与JDK的关系、JRE...
【电脑故障小解】 在日常使用电脑过程中,我们可能会遇到各种各样的问题,这篇文档提供了一些常见电脑故障的解决办法。 1、影音文件在 XP 中无法删除 这可能是因为 Windows XP 的预览功能导致的问题。你可以通过...
理解AHB与APB协议对于设计高效的嵌入式系统至关重要,它们允许灵活地连接不同速度和功能的组件,优化系统性能和功耗。在实际设计中,根据系统的具体需求选择合适的总线协议,并正确处理信号延迟和同步问题,是保证...