1)简单工厂模式(静态工厂方法):根据参数类型type创建不同类型的实例。
package com.factorymethod;
public class FactoryMethod {
public static void main(String[] args) {
Application application = new Application();
Product product = application.getObject("A1");
product.method();
}
}
interface Product{
public void method();
}
class ProductA implements Product {
public void method(){
System.out.println("ProductA.method executed");
}
}
class ProductA1 implements Product {
public void method(){
System.out.println("ProductA1.method executed");
}
}
class SimpleFactory{
public static Product createProduct(String type){
if("A".equals(type)){
return new ProductA();
}else if("A1".equals(type)){
return new ProductA1();
}
return null;
}
}
class Application {
private Product createProduct(String type){
//...
return SimpleFactory.createProduct(type);
}
Product getObject(String type){
return createProduct(type);
}
}
2)concrete工厂方法模式:
- 当你不知道对象的确切类型的时候
- 当你希望为库或者框架提供其内部组件的方法时
主要优点:
- 将具体产品和创建者解耦
- 符合单一职责原则
- 符合开闭原则
package com.factorymethod;
public class FactoryMethod {
public static void main(String[] args) {
Application application = new concreteProductA1();
Product product = application.getObject();
product.method();
}
}
interface Product{
public void method();
}
class ProductA implements Product {
public void method(){
System.out.println("ProductA.method executed");
}
}
class ProductA1 implements Product {
public void method(){
System.out.println("ProductA1.method executed");
}
}
abstract class Application {
abstract Product createProduct();
Product getObject(){
return createProduct();
}
}
class concreteProductA extends Application{
@Override
Product createProduct() {
return new ProductA();
}
}
class concreteProductA1 extends Application{
@Override
Product createProduct() {
return new ProductA1();
}
}
源码中的应用:
//静态工厂方法
java.util.Calendar.getInstance();
java.util.ResourceBundle.getBundle();
java.text.NumberFormat.getInstance();
//工厂方法
java.net.URLStreamHandlerFactory
createMarshaller