现在的位置: 首页 > 综合 > 正文

设计模式笔记0.接口和工厂

2018年04月18日 ⁄ 综合 ⁄ 共 1849字 ⁄ 字号 评论关闭

1.假如有一个Busisness类要用到一个Printer类来输出内容,可以这样写

package com.test;

public class TestInterfaceOne {
	public static void main(String args[]) {
		Business business = new Business();
		business.UsePrinterToPrint();
	}
}

class Business {
	
	public void UsePrinterToPrint() {
		PrinterA printerA = new PrinterA();
		printerA.print();
	}
}

class PrinterA {
	public void print(){
		System.out.println("this is printed by PrinterA");
	}
}

2.但是注意到Printer类现在是PrinterA,以后还可能被替换为PrinterB,PrinterC,PrinterX...,要替换的话会频繁改动Business里面的UsePrinterToPrint()里面的代码,

所以抽象出一个接口类IPrinter,像这样:

package com.test;

public class TestInterfaceTwo {
	public static void main(String args[]) {
		Business business = new Business();
		business.UsePrinterToPrint();
	}
}

class Business {
	
	public void UsePrinterToPrint() {
		IPrinter printer = new PrinterB();
		printer.print();
	}
}

interface IPrinter {
	public void print();
}

class PrinterA implements IPrinter {
	public void print(){
		System.out.println("this is printed by PrinterA");
	}
}

class PrinterB implements IPrinter {
	public void print(){
		System.out.println("this is printed by PrinterB");
	}
}

3.改成接口后,以后每次更换Printer,只需要改动UsePrinterToPrint()里面new出来的Printer就行了,

但是这样子仍然要改动Business里面的代码,如果改动一个类后需要改动另一个类的代码,那么就说这两个类之间有依赖关系,

为了不让Business与不同的Printer之间有依赖关系,使得以后可以不改动Business的代码,

我们引入了一个工厂类PrinterFactory作为他们之间的"中介",由PrinterFactory来决定要生产出哪一个Printer来给Business用,像这样:

package com.test;

public class TestInterfaceThree {
	public static void main(String args[]) {
		Business business = new Business();
		business.UsePrinterToPrint();
	}
}


class Business {
	
	public void UsePrinterToPrint() {
		
		new PrinterFactory().getPrinter().print();		
	}
}


class PrinterFactory {
	public IPrinter getPrinter() {
		return new PrinterB();
		//return new PrinterA;
	}
}

interface IPrinter {
	public void print();
}

class PrinterA implements IPrinter {
	public void print(){
		System.out.println("this is printed by PrinterA");
	}
}

class PrinterB implements IPrinter {
	public void print(){
		System.out.println("this is printed by PrinterB");
	}
}

4. 这样,以后我们要更换Printer,只需要改动工厂PrinterFactory里面的getPrinter()方法就行了,不用改动Business里面的代码

抱歉!评论已关闭.