Java设计模式——工厂模式

工厂模式

本质:创建对象不使用new而使用工厂方法代替。

简单工厂模式

工厂所管理的类的统一接口:Product

 public interface Product {
  void work();
 }

具体实现类:Phone和Computer

 public class Computer implements Product {
  @Override
  public void work() {
  System.out.println("computer work...");
  }
 }
 public class Phone implements Product {
  @Override
  public void work() {
  System.out.println("phone work...");
  }
 }

工厂类创建根据传入的名称创建对应产品:

 public class SimpleFactory {
  public static Product getProduct(String name){
  switch (name){
  case "phone":
  return new Phone();
  case "computer":
  return new Computer();
  default:
  return null;
  }
  }
  public static void main(String[] args) {
  Product phone = SimpleFactory.getProduct("phone");
  if (phone!=null){
  phone.work();
  }
  }
 }

优点:编写简单

缺点:每次新增一个产品类型都要改动getProduct()代码。

工厂方法模式

产品和简单工厂一样继承Product

新增接口 ProductFactory 用于生成产品

 public interface ProductFactory {
  Product getProduct();
 }

新增实际产品的工厂

 /**
  * @author objcfeng
  * @description 电脑工厂
  * @date 2020/10/20
  */
 public class ComputerFactory implements ProductFactory {
  @Override
  public Product getProduct() {
  return new Computer();
  }
 }
 public class PhoneFactory implements ProductFactory {
  @Override
  public Product getProduct() {
  return new Phone();
  }
 }

测试类:

 public class Main {
  public static void main(String[] args) {
  new PhoneFactory().getProduct().work();
  }
 }

相较于简单工厂模式来说,解决了对修改关闭的不支持的问题,但是代码更复杂。

抽象工厂模式

image.png
image.png
image.png

image

产品不需要统一的接口,因为若都实现统一的接口,在产品工厂生产产品时,不好做区分,需要传入参数做判断。

产品

手机接口

 public interface IPhoneProduct {
  void work();
 }

路由器接口

 public interface IRouterProduct {
  void work();
 }

产品的实现类:

 public class HuiWeiPhone implements IPhoneProduct {
  @Override
  public void work() {
  System.out.println("华为手机");
  }
 }

...

产品工厂

 public interface ProductFactory {
  IRouterProduct getRouter();
  IPhoneProduct getPhone();
 }

华为工厂

 public class HuaWeiFactory implements ProductFactory {
  @Override
  public IRouterProduct getRouter() {
  return new HuaWeiRouter();
  }
 ​
  @Override
  public IPhoneProduct getPhone() {
  return new HuiWeiPhone();
  }
 }

小米工厂:

 public class XiaoMiFactory implements ProductFactory {
  @Override
  public IRouterProduct getRouter() {
  return new XiaoMiRouter();
  }
 ​
  @Override
  public IPhoneProduct getPhone() {
  return new XiaoMiPhone();
  }
 }

测试:

 public class Main {
  public static void main(String[] args) {
  new XiaoMiFactory().getPhone().work();
  }
 }

抽象工厂方法把一个品牌的产品很好的分离开来,添加产品族(一个品牌的所有产品)很方便。

阅读 103

推荐阅读