快速学习简单工厂,普通工厂,抽象工厂
- 前言:产品等级和产品族
- 工厂模式作用
- 简单工厂模式
- uml
- 代码
- 优缺点
 
- 普通工厂模式
- uml
- 代码
- 优缺点
 
- 抽象工厂模式
- uml
- 代码
- 优缺点
 
 
前言:产品等级和产品族
在学习工厂模式之前,先得了解一下产品等级和产品族的概念。
 产品等级:不同品牌的同一产品处于同一产品等级。
 产品族:同一品牌的不同产品 处于同一产品族。
 比如华为平板,小米平板,苹果平板处于同一产品等级。
 比如华为平板,华为手机,华为电脑处于同一产品族。

工厂模式作用
当数据源或者对象的创建比较复杂时,可以考虑采用工厂模式。
简单工厂模式
简单工厂模式很简单,一般只有一个产品等级。
 比如只生产手机:苹果手机,华为手机这类的
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();
  }
}
优缺点
可以新增一个产品族,比如加个小米系列
 但不能增加产品等级,就不能加路由器产品。



















