设计模式之Template Method模式、Factory Method 模式

Template Method模式


将具体处理交给子类

带有模板功能的模式。在父类中定义处理流程的框架,在子类中实现具体处理的模式。
实际上就是定义一个父类,父类中有着抽象方法和处理流程的模板方法,也就是子类共用的方法,好比人都会伸手,但是伸手做什么,由子类决定。子类继承并实现了父类的抽象方法,但是不重写父类的模板方法。

特征

  1. 父类有抽象和模板方法,模板方法调用了抽象方法;
  2. 子类实现抽象方法,不重写模板方法;

出场角色

  • 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();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值