码迷,mamicode.com
首页 > 其他好文 > 详细

工厂模式学习笔记

时间:2018-03-06 23:19:14      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:类测试   class   oid   markdown   new   手机品牌   一个   sig   blog   

人类工业进化史 与 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

工厂模式学习笔记

标签:类测试   class   oid   markdown   new   手机品牌   一个   sig   blog   

原文地址:https://www.cnblogs.com/qq347061329/p/8519451.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!