工厂方法模式
有多个功能需要使用打印机的功能,在之后的时间有可能会添加新的打印机,为了避免大量的重复代码的大量修改,将重复代码写在一个函数中,方便修改
实例如下:
1、创建一个打印的接口
interface Printer
{
void open();
void close();
void print(String s);
}
2、创建佳能打印机,并且事项接口printer
class CanonPrinter implements Printer
{
public void open()
{
System.out.println("CanonPrinter open");
}
public void print(String s)
{
System.out.println("CanonPrinter print ---->" + s);
}
private void clean() //不允许外部类使用,所以使用private
{
System.out.println("CanonPrinter clean");
}
public void close()
{
this.clean();
System.out.println("CanonPriter close");
}
}
3、创建惠普打印机
class HPPrinter implements Printer
{
public void open()
{
System.out.println("HP open");
}
public void close()
{
System.out.println("HP close");
}
public void print(String s)
{
System.out.println("HP print ---->" + s);
}
}
需要添加一种新的打印机
class XXXPrinter implements Printer
{
public void open()
{
System.out.println("XXXPrinter open");
}
public void print(String s)
{
System.out.println("XXXPrinter print ---->" + s);
}
public void close()
{
System.out.println("XXXPrinter close");
}
}
4、修改程序,测试
class Test
{
public static void main(String args [])
{
int a = 2;
Printer printer = PrinterFactory.getPrinter(a); //工厂模式,只需要在工厂类中添加一小段代码即可
printer.open();
printer.print("abc");
printer.close();
}
}
class PrinterFactory<span style="white-space:pre"> </span>//工厂类
{
public static Printer getPrinter(int flag)
{
Printer printer = null;
if(flag == 0)
{
printer = new HPPrinter();
}
else if(flag == 1)
{
printer = new CanonPrinter();
}
else if(flag == 2) //新添加的打印机
{
printer = new XXXPrinter();
}
return printer;
}
}
普通模式
普通模式下,当添加一种类型的打印机时,需要每个功能都添加一句功能,修改的重复代码多,容易漏掉
class Test
{
public static void main(String args [])
{
int flog = 2;
Printer printer = null;
<span style="white-space:pre"> </span>if(flag == 0)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>printer = new HPPrinter();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>else if(flag == 1)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>printer = new CanonPrinter();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>else if(flag == 2)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>printer = new XXXPrinter();
<span style="white-space:pre"> </span>}
printer.open();
printer.print("abc");
printer.close();
}
}