天天看點

工廠模式-三種類型

1.普通工廠模式

可以封裝不同的實作,統一為一個方法,但是需要傳不同的參數。使得程式容易維護和擴充。

Test.java

package cn.test.factorymethod;

public class Test {

	public static void main(String[] args) {
		
		//執行個體化工廠
		Factory factory = new Factory();
		Print print = factory.createWindow("HP");
		print.print();
		
		Print print2 = factory.createWindow("EPSON");
		print2.print();
		
	}
	
}
           

Factory.java

package cn.test.factorymethod;

public class Factory {
  
    public Print createWindow (String type) {
        if(type.equals("HP")) {
            return new PrintHP();
        } else if(type.equals("EPSON")) {
            return new PrintEPSON();
        } else{
        	return new PrintHP();
        }
    }
    
}
           

Print.java

package cn.test.factorymethod;

public abstract class Print {
	
    public abstract void print();
    
}
           

PrintEPSON.java

package cn.test.factorymethod;

public class PrintEPSON extends Print {
    
    @Override
    public void print() {
        System.out.println("I'm EPSON");
    }
}
           

PrintHP.java

package cn.test.factorymethod;

public class PrintHP extends Print {
    
	@Override
	public void print() {
		
		 System.out.println("I'm HP");
	}
}
           

傳回結果:

I'm EPSON

I'm HP

2.多個工廠模式

在普通工廠方法模式中,如果傳遞的字元串出錯,則不能正确建立對象,而多個工廠方法模式是提供多個工廠方法,分别建立對象

修改Factory.java類如下:

package cn.test.factorymethod;

public class Factory {
  
  public Print epson(){
	  return new PrintEPSON();
  }
 
  public Print hp(){
	  return new PrintHP();
  }
    
}
           

修改Test.java類如下:

package cn.test.factorymethod;

public class Test {

	public static void main(String[] args) {

		// 執行個體化工廠
		Factory factory = new Factory();
		Print print = factory.epson();
		print.print();

		Print print2 = factory.hp();
		print2.print();

	}

}
           

傳回結果:

I'm EPSON

I'm HP

3.靜态工廠模式

将上面的多個工廠方法模式裡的方法置為靜态的,不需要建立執行個體,直接調用即可。

修改Factory.java類如下:

package cn.test.factorymethod;

public class Factory {
  
  public static Print epson(){
	  return new PrintEPSON();
  }
 
  public static Print hp(){
	  return new PrintHP();
  }
    
}
           

修改Test.java類如下:

package cn.test.factorymethod;

public class Test {

	public static void main(String[] args) {

		Print print = Factory.epson();
		print.print();

		Print print2 = Factory.hp();
		print2.print();

	}

}
           

傳回結果:

I'm EPSON

I'm HP