Java设计模式之工厂方法模式

概述

工厂方法模式是创建型设计模式的一种,
工厂方法模式也叫工厂模式或虚拟构造器模式,在工厂方法模式中,一个工厂父类包含多个工厂子类,父类定义接口,子类负责创建具体的产品对象.

定义

定义一个用于创建对象的接口,让子类决定实例化那个类,工厂方法使一个类的实例化延迟到其子类。

使用场景

在任何需要生成复杂对象的地方,都可以使用工厂方法模式,复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式

UML

工厂方法模式

其中涉及到的角色有

  • 抽象工厂(Creator) : 工厂方法模式的核心
  • 具体工厂(ConcreateCreator) : 实现了具体的业务逻辑
  • 抽象产品(Product) : 工厂方法模式所创建的产品的父类
  • 具体产品(ConcreateProduct) : 实现抽象产品的某个具体产品对象

实例

工厂方法模式分为三种,普通工厂模式,多个工厂方法模式,静态工厂方法模式,其实在工厂方法模式中还有一种特例,叫做简单工厂模式(或者静态工厂方法模式),
静态工厂模式是Effective Java第一条推荐的创建对象的方式,静态工厂方法常见于我们的工具类,如TextUtil等,

  • 普通工厂模式实例代码
//抽象产品类
public abstract class Product {

  public abstract void method();
}
//具体产品类
public class ConcreteProductA extends Product {

  private static final String TAG = "ConcreteProductA";

  @Override public void method() {
    Log.d(TAG, "method: -->我是具体的产品A");
  }
}

public class ConcreteProductB extends Product {
  private static final String TAG = "ConcreteProductB";
  @Override public void method() {
    Log.d(TAG, "method: -->我是具体的产品B");
  }
}
// 抽象工厂类
public abstract class Factory {

  public abstract Product createProduct();
}
// 具体工厂类
public class ConcreteFactory extends Factory {
  @Override public Product createProduct() {
    return new ConcreteProductA();
    //return new ConcreteProductB();
  }
}

//客户端调用代码
Factory factory = new ConcreteFactory();
   Product product = factory.createProduct();
   product.method();
  • 多个工厂方法模式

多个方法工厂模式是普通工厂方法模式的升级版,就是工厂中提供多个方法

public class ConcreteFactory extends Factory {
  @Override public Product createProductA() {
    return new ConcreteProductA();
  }
  @Override public Product createProductB() {
    return new ConcreteProductB();
  }
}
  • 静态工厂方法模式,在多个工厂方法模式的基础上进一步改造
public class ConcreteFactory extends Factory {
  @Override public static Product createProductA() {
    return new ConcreteProductA();
  }
  @Override public static Product createProductB() {
    return new ConcreteProductB();
  }
}

这样的话,客户端的调用就不需要创建工厂对象了

Product productA = ConcreteFactory.createProductA();
productA.method();

Product productB = ConcreteFactory.createProductB();
productB.method();

优缺点

优点
  • 良好的封装性和清晰的代码结构,不需要知道对象的创建过程,降低模块间的耦合.
  • 优秀的拓展性,如果需要增加产品,只需要拓展一个工厂类即可,很好的拥抱了变化.
  • 屏蔽产品类,产品类的任何变化,客户端都不需要关心,只需要关注产品接口即可.
  • 解耦,高层模块只需要知道产品的抽象类,不需要关心其实现
缺点
  • 结构复杂化,每次添加新产品时,都需要编写一个新的产品类.同时还要引入其抽象层,导致结构变得复杂,因此在特定场景是否使用工厂方法模式还需设计者权衡利弊了
  • 一个工厂只能创建一种产品.

实例代码

DesignPatterns

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值