工厂方法模式[Factory Mothod]
工厂方法模式[Factory Mothod]
模式定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类。
设计模式对稳定的部分提炼出来,成为一种模式。
应用场景:
- 1 当你不知道该使用对象的确切类型的时候
- 2 当你希望库或者框架提供扩展其内部组件的方法时
主要优点:
- 1 将具体产品和创建者解耦
- 2 符合单一职责原则
- 3符合开闭原则
工厂方法模式的结构
工厂方法模式的主要角色如下。
1:抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
2:具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
3:抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
4:具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
重构前:
package factorymethod;
public class FactoryMethod {
public static void main(String[] args) {
Application application = new Application();
ProductA product = application.getObject();
product.method1();
}
}
class ProductA {
public void method1(){
System.out.println("ProductA.method1 executed.");
}
}
class Application{
private ProductA createProduct(){
return new ProductA();
}
ProductA getObject(){
//创建一个实例,并返回
ProductA product = createProduct();
return product;
}
}
简单工厂重构后:
package factorymethod;
public class FactoryMethod {
public static void main(String[] args) {
Application application = new Application();
Product product1 = application.getObject("0");
Product product2 = application.getObject("1");
product1.method1();
product2.method1();
}
}
interface Product{
public void method1();
}
class ProductA implements Product{
//假设method1是稳定的代码
@Override
public void method1(){
System.out.println("ProductA.method1 executed.");
}
}
class ProductA1 implements Product{
//假设method1是稳定的代码
@Override
public void method1(){
System.out.println("ProductA1.method1 executed.");
}
}
class SimpleFactory{
public static Product createProduct(String type){
if (type.equals("0")){
return new ProductA();
}else if(type.equals("1")){
return new ProductA1();
}else{
return null;
}
}
}
class Application{
private Product createProduct(String type){
return SimpleFactory.createProduct(type) ;
}
Product getObject(String type){
//创建一个实例,并返回
Product product = createProduct(type);
return product;
}
}
工厂方法的重构:
package factorymethod;
public class FactoryMethod {
public static void main(String[] args) {
Application application = new ConcreateProductA1();
Product product1 = application.getObject();
product1.method1();
}
}
interface Product{
public void method1();
}
class ProductA implements Product{
//假设method1是稳定的代码
@Override
public void method1(){
System.out.println("ProductA.method1 executed.");
}
}
class ProductA1 implements Product{
//假设method1是稳定的代码
@Override
public void method1(){
System.out.println("ProductA1.method1 executed.");
}
}
abstract class Application{
abstract Product createProduct();
Product getObject(){
//创建一个实例,并返回
Product product = createProduct();
return product;
}
}
class ConcreteProductA extends Application{
@Override
Product createProduct() {
return new ProductA();
}
}
class ConcreteProductA1 extends Application{
@Override
Product createProduct() {
return new ProductA1();
}
}
源码中的应用:
-
静态工厂方法
Calendar.getInstance() java.text.NumberFormat.getInstance()
-
工厂方法
java.net.URLStreamHandlerFactory