十分钟学完简单工厂,普通工厂,抽象工厂

前言:产品等级和产品族

在学习工厂模式之前,先得了解一下产品等级和产品族的概念。
产品等级:不同品牌的同一产品处于同一产品等级
产品族:同一品牌的不同产品 处于同一产品族
比如华为平板,小米平板,苹果平板处于同一产品等级。
比如华为平板,华为手机,华为电脑处于同一产品族。

在这里插入图片描述

工厂模式作用

当数据源或者对象的创建比较复杂时,可以考虑采用工厂模式。

简单工厂模式

简单工厂模式很简单,一般只有一个产品等级。
比如只生产手机:苹果手机,华为手机这类的

uml

在这里插入图片描述
简单工厂模式很简单,就三步
1.创建一个产品接口(手机)
2.对该接口实现(华为手机,苹果手机)
3.写一个工厂类,用来生成对应的手机,一般提供一个静态方法,方法只有一个入参,用来选择生成的手机是什么牌子的。

代码

//1.创建一个产品接口(手机)
public interface Phone{
  void show();
}

//对该接口实现(华为手机,苹果手机)
public class HuaWeiPhone implements Phone{
  @Override
  public void show(){
      System.out.println("生产了一部华为手机");
  }
}

public class PingGuoPhone implements Phone{
  @Override
  public void show(){
      System.out.println("生产了一部苹果手机");
  }
}

//写一个工厂类,用来生成对应的手机
public class PhoneFactory{
   // 法一:
   public static Phone createPhone(String brand){
        Phone phone = null;
        Switch(brand){
           case "Apple" :
              phone = new PingGuoPhone();
              break;
           case "HuaWei" :
              phone = new HuaWeiPhone ();
              break;
           default:
              break;
        }
        return phone;
   }
   // 法二:
    public static <T extends Phone> T createPhone(Class<T> clz){
        Phone phone = null;
        try{
             phone = clz.newInstance();
        } catch(InstantiationException e){
             e.printStackTrace();
        } catch(IllegalAccessException e){
             e.printStackTrace();
        }
        return (T) iceCream;
   }
}

优缺点

一般来说简单工厂类是法一的写法,此时如果你加一个小米手机,你得先实现phone接口,这个没问题,但是你还得把工厂里面的createPhone方法改写,不符合开闭原则。法二不存在问题。
此外工厂类负责了所有产品的实例化,违反了单一原则。法一和法二都有问题

普通工厂模式

在简单工厂模式上稍作修改,对工厂进行抽象

uml

在这里插入图片描述
相比较简单工厂模式,对工厂进行了抽象。

代码

//1.创建一个产品接口(手机)
public interface Phone{
  void show();
}

//对该接口实现(华为手机,苹果手机)
public class HuaWeiPhone implements Phone{
  @Override
  public void show(){
      System.out.println("生产了一部华为手机");
  }
}

public class PingGuoPhone implements Phone{
  @Override
  public void show(){
      System.out.println("生产了一部苹果手机");
  }
}

//创建工厂接口
public interface PhoneFactory{
  public Phone createPhone();
}
//对该接口实现(华为手机工厂,苹果手机工厂)
public class PingGuoPhoneFactory implements PhoneFactory{
  @Override
  public Phone createPhone(){
     return new PingGuoPhone();
  }
}

public class HuaWeiPhoneFactory implements PhoneFactory{
  @Override
  public Phone createPhone(){
     return new HuaWeiPhone();
  }
}

优缺点

为了弥补简单工厂的缺点,普通工厂模式对工厂类也做了抽象
这样一个工厂只生产一个品牌手机,复合单一原则。
如果新增小米手机不用修改代码,直接扩展。
对于拓展同一等级的产品很友好,但在这种情况下只能生产这么一种产品,手机,不能生产多产品。

抽象工厂模式

要生产多个牌子的产品,且产品族产品数量有多个。
比如要生产苹果下面的手机和平板,华为下面的手机和平板

uml

在这里插入图片描述
相比较于普通工厂模式有两点不同
1:多了一个产品 平板
2:工厂类中多了一个生产平板的方法

代码

//1.创建一个产品接口(手机)
public interface Phone{
  void show();
}

//对该接口实现(华为手机,苹果手机)
public class HuaWeiPhone implements Phone{
  @Override
  public void show(){
      System.out.println("生产了一部华为手机");
  }
}

public class PingGuoPhone implements Phone{
  @Override
  public void show(){
      System.out.println("生产了一部苹果手机");
  }
}

//2.创建一个产品接口(平板)
public interface Pad{
  void show();
}

//对该接口实现(华为平板,苹果平板)
public class HuaWeiPad implements Pad{
  @Override
  public void show(){
      System.out.println("生产了一部华为平板");
  }
}

public class PingGuoPad implements Pad{
  @Override
  public void show(){
      System.out.println("生产了一部苹果平板");
  }
}

//创建平板工厂接口
public interface Factory{
  public Pad createPad();
  public Phone createPhone();
}
//对该接口实现(华为平板工厂,苹果平板工厂)
public class PingGuoFactory implements Factory{
  @Override
  public Pad createPad(){
     return new PingGuoPad();
  }
    @Override
  public Phone createPhone(){
     return new PingGuoPhone();
  }
}

public class HuaWeiFactory implements Factory{
  @Override
  public Pad createPad(){
     return new HuaWeiPad();
  }
    @Override
  public Phone createPhone(){
     return new HuaWeiPhone();
  }
}

优缺点

可以新增一个产品族,比如加个小米系列
但不能增加产品等级,就不能加路由器产品。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值