工厂模式学习笔记

人类工业进化史 与 java设计模式

  1. 石器时代: new Object();
  2. 小作坊模式: 简单工厂模式
  3. 小工厂: 工厂方法模式
  4. 流水线大厂: 抽象工厂模式

简单工厂

  • 注: 下面都会以手机厂商举例来理解各个设计模式, 全部代码会在最后提供下载地址
  • 首先需要一些手机的抽象与实体,以水果X为例
    public interface Phone {
        String getName();
        String getOrigin();
    }
    
    /**
    * 水果X
    */
    public class IPhoneX implements Phone{
    
        public IPhoneX(){
    
        }
        /**
         * 产地
         */
        private String origin;
    
        public IPhoneX(String origin) {
            this.origin = origin;
        }
    
        public String getName() {
            return "IPHONEX";
        }
    
        @Override
        public String getOrigin() {
            return this.origin;
        }
    
    }
    
  • 简单工厂模式的实现
    /**
    * 小作坊: 简单工厂, 啥也能做, 要啥给啥
    *  缺点: 啥也能做,修改动静太大, 不符合开闭原则, 新加一个手机品牌 , 增加对应品牌的实体, 需要修改         * simplefactory中if else的逻辑, 需要测试其整个方法的准确性
    *  优点: 从此用户不用再去new对象,用户本身不再关心生产的过程,而只需要关心这个结果
    */
    public class SimpleFactory{
        public Phone getPhone(String name) {
            if(name.equalsIgnoreCase("iphonex")){
                return new IPhoneX();
            }else if(name.equalsIgnoreCase("xiaomi")){
                return new XiaoMi();
            }else if(name.equalsIgnoreCase("huawei")){
                return new HuaWei();
            }else if(name.equalsIgnoreCase("nokia")){
                return new Nokia();
            }else {
                return null;
            }
        }
    }
    
  • 简单工厂测试
    public class SimpleFactoryTest {
        @Test
        public void testGetPhone() {
            SimpleFactory factory = new SimpleFactory();
            assertEquals("iphonex",factory.getPhone("iphonex").getName().toLowerCase());
        }
    }
    

工厂方法实现

  • 抽象的工厂接口
    /**
    * 工厂:
    * 工厂方法模式: 有了一定的规范, 各个产品都有对应的工厂
    *
    * 工厂必然具有生产产品技能,统一的产品出口
    * 适合只做产品, 产品不分族, 如果类似抽象工厂进行分组, 需要创建很多的工厂, DLNOKIAFACTORY、 HKNOKIAFACTORY....
    */
    public interface Factory {
        Phone getPhone();
    }
    
  • 工厂实现类
    public class IPhoneXFactory implements Factory{
        public Phone getPhone() {
            return new IPhoneX();
        }
    }
    
  • 工厂类测试
    public class FactoryTest {
        @Test
        public void testGetPhone() {
            Factory factory = new IPhoneXFactory();
            assertEquals("iphonex",factory.getPhone().getName().toLowerCase());
        }
    }
    

抽象工厂实现

  • 抽象工厂实现类
    /**
    * 流水线:
    * 抽象工厂是用户的主入口, 定义了所有实现工厂能做的产品
    * 在Spring中应用得最为广泛的一种设计模式
    * 易于扩展
    * 基本的逻辑都抽象出来, 而且可以进行随意组合, 用户只能用现有的功能,提高健壮性
    *
    * 适合既做产品, 并且产品分流水线, 分为 大陆\ 港版
    *
    */
    public abstract class AbstractFactory {
    
        abstract Phone getXiaoMi();
        abstract Phone getIPhoneX();
        abstract Phone getHuaWei();
        abstract Phone getNokia();
    
    }
    
  • 具体的流水线工厂
    /**
    * 大陆某具体工厂
    */
    public class DLPhoneFactory extends AbstractFactory{
    
        private final String ORIGIN = "dalu";
        Phone getXiaoMi() {
            return new XiaoMi(ORIGIN);
        }
    
        Phone getIPhoneX() {
            return new IPhoneX(ORIGIN);
        }
    
        Phone getHuaWei() {
            return new HuaWei(ORIGIN);
        }
    
        @Override
        Phone getNokia() {
            return new Nokia(ORIGIN);
        }
    }
    
  • 抽象工厂测试
    /**
    * 抽象工厂产生俩个实际工厂分别产生自己的产品
    */
    public class AbstractFactoryTest {
    
        @Test
        public void testGetPhone() {
    
            AbstractFactory dlPhoneFactory = new DLPhoneFactory();
            assertEquals("iphonex",dlPhoneFactory.getIPhoneX().getName().toLowerCase());
        }
    }
    

最后附上源码下载地址:

  • github地址: git@github.com:offline7LY/designpattern.git
posted @ 2018-03-06 22:05  p205  阅读(137)  评论(0编辑  收藏  举报