工厂模式

实质:创建对象不应用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();  } }

相较于简略工厂模式来说,解决了对批改敞开的不反对的问题,然而代码更简单。

形象工厂模式



产品不须要对立的接口,因为若都实现对立的接口,在产品工厂生产产品时,不好做辨别,须要传入参数做判断。

产品

手机接口

 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();  } }

形象工厂办法把一个品牌的产品很好的拆散开来,增加产品族(一个品牌的所有产品)很不便。