在构造方法中对属性进行赋值与用属性的setter的区别:

  构造方法中对属性进行赋值:固定,不可变;

  用属性的setter,可以在实例化对象后,动态的变化,比较灵活。

public class Duck{
FlyBehavior flyBehavior;//接口
QuackBehavior quackBehavior;//接口
public void setFlyBehavior(FlyBehavior flyBehavior){
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior  {
this.quackBehavior= quackBehavior;
}
}

  ------------------------- static Factory Method(静态工厂) -------------------------

  (1)在设计模式中,Factory Method也是比较简单的一个,但应用非常广泛,EJB,RMI,COM,CORBA,Swing中都可以看到此模式的影子,它是重要的模式之一.在很多地方我们都会看到xxxFactory这样命名的类.

  (2)基本概念:

  FactoryMethod是一种创建性模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类.

  通常我们将Factory Method作为一种标准的创建对象的方法。

  应用方面:

  当一个类无法预料要创建哪种类的对象或是一个类需要由子类来指定创建的对象时我们需要用到Factory Method 模式了.

  -------------------------------- singelton(单例模式) --------------------------------

  基本概念:

  Singleton 是一种创建性模型,它用来确保只产生一个实例,并提供一个访问它的全局访问点.对一些类来说,保证只有一个实例是很重要的,比如有的时候,数据库连接或 Socket 连接要受到一定的限制,必须保持同一时间只能有一个连接的存在.

  运用:

  在于使用static变量;

  创建类对象,一般是在构造方法中,或用一个方法来创建类对象。在这里方法中,加对相应的判断即可。

  单态模式与共享模式的区别:

  单态模式与共享模式都是让类的实例是的。

  但单态模式的实现方式是:

  在类的内部.即在构造方法中,或静态的getInstace方法中,进行判断,若实例存在,则直接返回,不进行创建;

  共享模式的实现方式是:

  每次要用到此实例时,先去此hashtable中获取,若获取为空,则生成实例,且将类的实例放在一人hashtable中,若获取不为空,则直接用此实例。

  (2)实例一:

public class Singleton {
private static Singleton s;
public static Singleton getInstance() {
if (s == null)
s = new Singleton();
return s;
}
}
// 测试类
class singletonTest {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
if (s1==s2)
System.out.println("s1 is the same instance with s2");
else
System.out.println("s1 is not the same instance with s2");
}
}

  singletonTest运行结果是:

  s1 is the same instance with s2

  (3)实例二:

class Singleton {
static boolean instance_flag = false; // true if 1 instance
public Singleton() {
if (instance_flag)
throw new SingletonException("Only one instance allowed");
else
instance_flag = true; // set flag for 1 instance
}
}

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

  (1)基本概念:

  观察者模式属于行为型模式,其意图是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

  这一个模式的关键对象是目标(Subject)和观察者(Observer)。一个目标可以有任意数目的依赖它的观察者,一旦目标的状态发生改变,所有的观察者都得到通知,作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。

  适用场景:

  观察者模式,用于存在一对多依赖关系的对象间,当被依赖者变化时,通知依赖者全部进行更新。因此,被依赖者,应该有添加/删除依赖者的方法,且可以将添加的依赖者放到一个容器中;且有一个方法去通知依赖者进行更新。

  (2)思想:

  (一)建立目标(subject)与观察者(observer)接口:

  目标(subject)接口:

  建立一个注册观察者对象的接口; public void attach(Observer o);

  建立一个删除观察者对象的接口; public void detach(Observer o);

  建立一个当目标状态发生改变时,发布通知给观察者对象的接口; public void notice();

  观察者(observer)接口:

  建立一个当收到目标通知后的更新接口: public void update();

  (3)实例:

  老师又电话号码,学生需要知道老师的电话号码以便于在合时的时候拨打,在这样的组合中,老师是一个被观察者(Subject),学生是需要知道信息的观察者,当老师的电话号码发生改变时,学生得到通知,并更新相应的电话记录。

  具体实例如下:

Subject代码:
public interface Subject{
public void attach(Observer o);
public void detach(Observer o);
public void notice();
}

Observer代码:
public interface Observer{
public void update();
}

Teacher代码;
import java.util.Vector;
public class Teacher implements Subject{
private String phone;
private Vector students;
public Teacher(){
phone = "";
students = new Vector();
}
public  void attach(Observer o){
students.add(o);
}
public void detach(Observer o){
students.remove(o);
}
public void notice(){
for(int i=0;i<students.size();i++)
((Observer)students.get(i)).update();
}
public void setPhone(String phone){
this.phone = phone;
notice();    --关键
}
public String getPhone(){
return phone;
}
}

Student代码:
public class Student implements Observer{
private String name;
private String phone;
private Teacher teacher;
public Student(String name,Teacher t){
this.name = name;
teacher = t;
}
public void show(){
System.out.println("Name:"+name+" Teacher'sphone:"+phone);
}
public void update(){
phone = teacher.getPhone();
}
}

Client代码:
package observer;
import java.util.Vector;
public class Client{         -->可以只定义目标者,观察者,另外的vector,只为了输入结果.
public static void main(String[] args){
Vector students = new Vector();
Teacher t = new Teacher();
for(int i= 0 ;i<10;i++){
Student st = new Student("lili"+i,t);
students.add(st);
t.attach(st);
}
t.setPhone("88803807");
for(int i=0;i<10;i++)
((Student)students.get(i)).show();
t.setPhone("88808880");
for(int i=0;i<10;i++)
((Student)students.get(i)).show();
}
}

  总结:Observer模式的知名的应用是在MVC结构,Observer模式可以很好的应用在文档和图表程序的制作中。