设计模式--模板方法模式 (Template Method)

  模板方法模式的目的就是在一个方法中实现一个算法,并将算法中某些步骤的定义推迟,从而使得其他类可以重新定义这些步骤。

  在编写一个方法的时候,考虑到算法的某些步骤可能会有不同的实现方式,我们可能会首先定出算法的框架。这样,在定义方法的时候,我们可以将某些步骤定义为抽象方法,或者是将它们定义为存根方法,也可以将它们定义为某个单独接口中的方法,这就是模板方法模式的实现。
  模板方法的典型例子就是排序。java.util.Collections类将sort()方法定义为一个模板方法,而将其中的比较交给用户来实现,sort()方法所接受的List中的对象需要实现Comparator接口,这就是将实际算法推迟并交给其它类来实现的模板方法模式。

继续阅读“设计模式--模板方法模式 (Template Method)”

设计模式--工厂方法模式 (Factory Method)

  并不是能创建并返回一个新的对象的方法都是工厂方法模式的实例。
  工厂方法模式不仅要求有一个能够创建新对象的方法,还要求能够使得客户代码无需了解应该具体实例化哪个类。工厂方法模式通常会包含有若干个类,这些类实现了相同的操作,返回了相同的抽象类型,然而,这些类的操作在内部实际上实例化了不同的类,不过这些类都实现了上述抽象类型。
  工厂方法模式的特征:
1. 该方法创建了一个新的对象
2. 该方法的返回类型为一个抽象类或接口
3. 有若干个类实现了上述抽象类或接口。

  比如我们要实现一个在线客户服务系统,若客服人员在线的时候,客户提交的问题将会直接传送给客服人员;若客服人员不在线,则将客户提交的问题发送至客服信箱。 继续阅读“设计模式--工厂方法模式 (Factory Method)”

设计模式--观察者模式 (Observer)

    观察者模式的宗旨:在多个对象之间定义一个一对多的关系,当一个对象状态改变的时候,其他所有的依赖于这个对象的对象能够得到通知,并自动更新。
    观察者模式在Swing中得到了广泛应用。当客户单击按钮时,程序中许多对象都会对此做出反应。在Swing中,关注Swing组件变化的类被称为“监听器”,这就是观察者模式的应用。

    为了支持观察者模式,Java类库中的java.util包中提供了Observable类和Observer接口。

    我们现在举一个例子来说明观察者模式。
    在网上商店的应用中,如果我们希望产品的名称被更改了后,系统会自动在控制台打印新名称,则就可以使用观察者模式。此时,产品类Product就需要继承Observable类,产品观察者类NameObserver则需要实现Observer接口。

继续阅读“设计模式--观察者模式 (Observer)”

设计模式--单体模式 (Singleton)

  单体模式的宗旨就是:使一个类只有一个实例。
  我们可以将类的constructor的可见性设置为私有来避免创建多个实例。当其他类调用该类的时候,我们可以利用getInstance()之类的方法来返回给调用者该类的实例。
  比如:

private Factory factory = null;
 
public static Factory getFactory() {
  if (factory == null) {
    factory = new Facotry();
}
 
return factory;
}

  上面的例子实现了单体模式,但如果在多线程环境中采用此方式,仍然可能产生多个实例,最好的办法,用synchronized来控制Factory实例的生成。

继续阅读“设计模式--单体模式 (Singleton)”

设计模式--适配器模式 (Adapter)

  当我们准备实现某个指定接口的时候,我们可能会发现现存的类已经提供了这种功能,只是方法名不同而已。这个时候,我们可以通过利用适配器模式来修改这个现存的类与外界交互的接口,从而使之满足用户的要求。

  适配器模式的宗旨就是,保留现有的类所提供的服务,修改其接口,从而达到客户期望。

  类适配器:

类适配器
类适配器

继续阅读“设计模式--适配器模式 (Adapter)”

设计模式--接口模式 (Interface)

  类的接口,就是该类允许其他类对象访问的方法和域的集合。一个类实现了某个接口,通常意味着该类的方法将会执行接口方法名表示的操作,遵循接口方法的代码注释和其他相关文档的要求。而类的实现就是位于这些方法体内的代码。

  比如:

interface Login {
  boolean login(String name, String password);
}

需要注意的地方:
 1. 接口的方法总是抽象的,无论是否显式地声明。
 2. 接口的方法总是公共的,无论是否显式地声明。
 3. 接口的可见性受限于其所在的包,因为Login没有显式地声明为public,所以其在包内可见。
 4. 一个接口可以扩展另一个接口。比如List接口扩展了Collection。
 5. 接口可以不包含方法。不包含方法的接口称为“标记”接口。比如Cloneable接口。
 6. 接口不能声明实例域,不过可以通过声明static和final修饰的域来声明常量。

MySQL 查询优化

1. 索引按顺序排列存储

2. 选择索引
  搜索的索引列,不一定是所要选择的列。出现在ON,WHERE和GROUP BY后的列适合作索引。
  使用惟一索引
    对于惟一值的列,索引的效果最好。例如:存放年龄的列具有不同值,所以很容易区分各行;而用来记录性别的列,只有’M’和’F’,不论搜索哪个值,都会得出大约一半的行,所以对其进行索引没有多大用途。
  使用短索引
    如果对字符串类型的列进行索引,应该指定一个前辍长度。比如一个varchar(200)的列,最好指定索引为前10个或20个字符内。(短的索引节省存储空间,并可能使查询更快)
  利用最左前辍
    在创建一个包含n列的索引时,实际上是创建了MySQL可以使用的n个索引。
多列索引可起几个索引的作用,因为可利用索引中最左边的列来匹配行。这样的列的集称为最左前辍。

  比如在一个表中的state, city和zip三个列上创建索引,那么索引中的行是按state/city/zip的次序存放的。因此,索引中的行也会自动按state/city的顺序和state的顺序来存放。所以,该索引可以用来搜索下列的列的组合:
    state/city/zip
    state/city
    state

继续阅读“MySQL 查询优化”

MySQL 5.0 字符集(2)--数据库连接中的字符集

1. 客户端以什么字符集来发送SQL命令?
character_set_client

2. 当服务器接收到SQL命令时,它会将其转换成什么字符集?
character_set_connection and collation_connection
服务器将客户端发送的SQL命令从character_set_client转换到character_set_connection
在进行字符串比较时,collation_connection将起作用。
但是在进行column中字符串比较时,collation_connection将不起作用,因为column有自己的collation。

3. 服务器将以什么字符集发送 给果/错误信息 给客户端?
character_set_results

继续阅读“MySQL 5.0 字符集(2)--数据库连接中的字符集”

MySQL 5.0 字符集(1)--服务器端的字符集

自4.1以后,MySQL增强了对字符集的支持。

名词解释:
—————————————————–
字符集(character set)是一套符号和编码。
而校对(collation)是在该字符集下,用于比较字符的一个规则。
—————————————————–

对于数据库,有四种级别的编码和整理设定:
1. server
2. database
3. table
4. column

继续阅读“MySQL 5.0 字符集(1)--服务器端的字符集”

MySQL 存储引擎及比较

查看当前数据库中安装的存储引擎:

mysql> SHOW ENGINES;
+------------+---------+----------------------------------------------------------------+
| Engine     | Support | Comment                                                        |
+------------+---------+----------------------------------------------------------------+
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance         |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables      |
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys     |
| BerkeleyDB | NO      | Supports transactions and page-level locking                   |
| BLACKHOLE  | NO      | /dev/null storage engine (anything you write to it disappears) |
| EXAMPLE    | NO      | Example storage engine                                         |
| ARCHIVE    | YES     | Archive storage engine                                         |
| CSV        | NO      | CSV storage engine                                             |
| ndbcluster | NO      | Clustered, fault-tolerant, memory-based tables                 |
| FEDERATED  | NO      | Federated MySQL storage engine                                 |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                          |
| ISAM       | NO      | Obsolete storage engine                                        |
+------------+---------+----------------------------------------------------------------+
12 rows in set (0.00 sec)

1. MyISAM存储引擎
MyISAM是默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。

继续阅读“MySQL 存储引擎及比较”

Pages:  1 2 3 4 5 6