1. 程式人生 > >工廠模式學習筆記

工廠模式學習筆記

private cto 實現類 廠商 @override 人類 rec 工業 ava

人類工業進化史 與 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地址: [email protected]:offline7LY/designpattern.git

工廠模式學習筆記