前言:

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

本次的代码基于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;
    }
}
  • 总结
    • 简单工厂模式是最简单的工厂模式,在开发中用得较少。

    • 结构图

工厂模式

  • 实现

    • 抽象产品
    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("Iam 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),是对面向编程中多态极致的体现。

    • 结构图

抽象工厂模式