Template Method模式
将具体处理交给子类
带有模板功能的模式。在父类中定义处理流程的框架,在子类中实现具体处理的模式。
实际上就是定义一个父类,父类中有着抽象方法和处理流程的模板方法,也就是子类共用的方法,好比人都会伸手,但是伸手做什么,由子类决定。子类继承并实现了父类的抽象方法,但是不重写父类的模板方法。
特征
- 父类有抽象和模板方法,模板方法调用了抽象方法;
- 子类实现抽象方法,不重写模板方法;
出场角色
-
AbstractClass(抽象类)
AbstractClass角色不仅负责 实现模板方法,还负责声明在模板方法中所使用到的抽象方法。
-
ConcreteClass(具体类)
负责具体实现AbstractClass角色中定义的抽象方法。
abstract class AbstractDisplay{ public abstract void open(); public abstract void print(); public abstract void close(); public final void display() { open(); print(); close(); } } class CharDisplay extends AbstractDisplay{ String c ; public CharDisplay(String c) { this.c = c; } public void open() { System.out.print("<"); } public void print() { System.out.print(c); } public void close() { System.out.print(">"); } } public class thread { public static void main(String[] args) throws InterruptedException { //使用了上溯造型,将子类当做父类使用。 AbstractDisplay ad = new CharDisplay("你好"); ad.display(); } }
Factory Method 模式
将实例的生成交给了子类
父类决定实例的生成方式,但不决定所要生成的具体的类,具体的处理全部交给了子类负责。可以将生成实例的框架和实际负责生成实例的类解耦
实际上就是使用父类的工厂方法,来生成实例对象,不用new关键字来生成实例,而是调用了生成实例的专用方法来生成实例,可以防止父类与其他具体类耦合
出场角色
-
Product(产品)
定义了在Factory Method模式中生成的实例所继承,持有的接口(API),具体的处理由ConcreteProduct角色决定
-
Creator(创建者)
负责生成Product角色的抽象类,具体的处理由子类ConcreteCretor所决定
-
ConcreteProduct(具体的产品)
决定了具体的产品
-
ConcreteCreator(具体的创建者)
负责生成具体加工的产品
abstract class Factory {
public final Product create(String owner) {
Product p = createProduct(owner);
return p;
};
public abstract Product createProduct(String owner);
}
abstract class Product {
public abstract void use();
}
class IDCard extends Product {
IDCard(String owner) {
System.out.println(owner + "的ID卡");
}
public void use() {
System.out.println("使用ID卡");
}
}
class IDCardFactory extends Factory {
//在这里生成了实例,使用了new,想new谁就new谁,由子类决定,生成实例对象时,只要工厂new对了,就能够生成想应的实例。
public Product createProduct(String owner) {
IDCard product = new IDCard(owner);
return product;
};
}
public class TestFactoryMethod {
public static void main(String[] args) {
//这里new的是生成IDCard的工厂对象,如果有其他工厂子类,可以new其他子类,生成其他相应的对象。
Factory f = new IDCardFactory();
IDCard id = (IDCard) f.create("Edward");
id.use();
}
}