工厂模式

前言:

在我个人认为,在框架的后续学习中占据着挺重要的地位,这些模式让你能够更容易了解各类框架的设计理念,进一步提升你的编程水平,但最重要的是你能更容易的去记住框架的用法,所有东西都是,你想学的东西都是在你前面已经学过理解过一点才能继续学下去。

本次的代码基于Java编写

简单工厂模式

  • 实现

    • 抽象产品
    public abstract class Product{
      //Other public business methods
      public void businessMethods(){}
      //different methods of concrete products
      public abstract void concreteMethods();
    }
    
    • 具体产品
    public class ConcreteProductA extends Product{
        /**
         * 实现业务方法
         */
        @Override
        public void methodDiff() {
            System.out.println("Product A");
        }
    }
    
    public class ConcreteProductB extends Product {
        @Override
        public void methodDiff() {
            System.out.println("Product B");
        }
    }
    
    • 工厂角色
    public class Factory {
        //Static factory method
        public static Product getProduct(String arg){
            Product product = null;
            if(arg.equalsIgnoreCase("A")){
                product = new ConcreteProductA();
                //Initialize product
            }else if(arg.equalsIgnoreCase("B")){
                product = new ConcreteProductB();
            }
            return product;
        }
    }
    
  • 总结

    • 简单工厂模式是最简单的工厂模式,在开发中用得较少。

    • 结构图

      simplefactoryUML.png

工厂模式

  • 实现

    • 抽象产品
    public interface Product {
        //产品默认信息
        public void info();
    }
    
    • 具体产品
    //Product food
    public class Food implements Product{
        @Override
        public void info() {
            System.out.println("I am the food!");
        }
    }
    
    //Product clothe
    public class Clothe implements Product {
        @Override
        public void info() {
            System.out.println("I am a clothe!");
        }
    }
    
    • 抽象工厂
    //a interface
    public interface Factory{
      Product produceProduct(String className);
    }
    
    • 具体工厂
    //concrete food factory
    public class FoodFactory implements Factory{
        Product product;
        @Override
        public Product produceProduct(String className) {
            try {
                product = (Product) Class.forName(className).getDeclaredConstructor().newInstance();
            }catch(Exception e){
                e.printStackTrace();
            }
            return product;
        }
    }
    
    //concrete clothe factory
    public class ClotheFactory implements Factory {
        Product product;
        @Override
        public Product produceProduct(String className) {
            try{
                product = (Product) Class.forName(className).getDeclaredConstructor().newInstance();
            }catch (Exception e){
                e.printStackTrace();
            }
            return product;
        }
    }
    
  • 总结

    • 优点:

      • 隐藏对象实例化细节,用户无需关心创建的细节,只需知道是什么工厂,用户不需再创建对象,由具体工厂来实现,控制权转移给了工厂;基于工厂模式的系统在添加新产品时,源码不需要进行修改,只需添加具体工厂,产品即可,保证了开闭原则。
    • 缺点

      • 虽确保了开闭原则,新增的具体类使得系统体积变得臃肿,增加开销。
    • 工厂模式是简单工厂模式的扩展,继承了简单工厂模式的优点,同时弥补其不足,使用频率极高,在Spring全家桶尤其明显(AOC),是对面向编程中多态极致的体现。

    • 结构图

      factoryUML.png

抽象工厂模式