zoukankan      html  css  js  c++  java
  • 简单工厂模式

     

    简单工厂模式定义

    简单工厂模式(Simple Factory Pattern),属于创建型模式,由于用于创建实例的方法是静态(static)方法,所以也被称为静态工厂方法(Static Factory Method)。简单工厂模式可以根据参数的不同返回不同类的实例。专门定义一个类来负责创建其他类的实例,而被创建的实例基本都有共同的父类。

    简单工厂模式适用环境

    1.创建产品的工厂类负责创建的对象比较少,因此不会造成工厂方法中的业务逻辑太复杂

    2.客户端只知道传入工厂的类的参数,对于方法内如何创建对象不关心

    UML类图解释

    Product:产品接口

    ProductA:具体产品A

    ProductB:具体产品B

    ProductC:具体产品C

    ProductFactory:创建产品工厂

    样例代码

    package com.sedion.mynawang.Chapter01_SimpleFactoryPattern;
    
    /**
     * 产品接口
     * @auther mynawang
     * @create 2016-12-28 16:58
     */
    public interface Product {
    }
    

      

    package com.sedion.mynawang.Chapter01_SimpleFactoryPattern;
    
    /**
     * 产品A
     * @auther mynawang
     * @create 2016-12-28 16:59
     */
    public class ProductA implements Product{
    }
    

      

    package com.sedion.mynawang.Chapter01_SimpleFactoryPattern;
    
    /**
     * 产品B
     * @auther mynawang
     * @create 2016-12-28 16:59
     */
    public class ProductB implements Product{
    }
    

      

    package com.sedion.mynawang.Chapter01_SimpleFactoryPattern;
    
    /**
     * 产品C
     * @auther mynawang
     * @create 2016-12-28 16:59
     */
    public class ProductC implements Product{
    }

      

    package com.sedion.mynawang.Chapter01_SimpleFactoryPattern;
    
    
    import java.util.logging.Logger;
    
    /**
     * 工厂类,用来生产产品(简单工厂类||静态工厂类)
     * @auther mynawang
     * @create 2016-12-28 17:04
     */
    public class ProductFactory {
    
        private static Logger logger = Logger.getLogger("ProductFactory_log");
    
        public static Product creatProduct(String productType) {
            Product product = null;
            if ("proA".equals(productType)) {
                product = new ProductA();
                logger.info("简单工厂==》创建了ProductA");
            } else if ("proB".equals(productType)) {
                product = new ProductB();
                logger.info("简单工厂==》创建了ProductB");
            } else if ("proC".equals(productType)) {
                product = new ProductC();
                logger.info("简单工厂==》创建了ProductC");
            } else {
                logger.info("简单工厂==》没有这样的产品");
            }
            return product;
        }
    
    }
    

      

    package com.sedion.mynawang;
    
    import com.sedion.mynawang.Chapter01_SimpleFactoryPattern.ProductFactory;
    
    /**
     * 简单工厂模式测试
     * @auther mynawang
     * @create 2016-12-28 17:03
     */
    public class Chapter01_SimpleFactoryPattern_test {
    
        public static void main(String[] args) {
            ProductFactory.creatProduct("proA");
            ProductFactory.creatProduct("proB");
            ProductFactory.creatProduct("proC");
            ProductFactory.creatProduct("proD");
        }
    
    }
    

      

    // 打印结果
    Connected to the target VM, address: '127.0.0.1:52152', transport: 'socket'
    十二月 28, 2016 5:27:11 下午 com.sedion.mynawang.Chapter01_SimpleFactoryPattern.ProductFactory creatProduct
    信息: 简单工厂==》创建了ProductA
    十二月 28, 2016 5:27:12 下午 com.sedion.mynawang.Chapter01_SimpleFactoryPattern.ProductFactory creatProduct
    信息: 简单工厂==》创建了ProductB
    十二月 28, 2016 5:27:12 下午 com.sedion.mynawang.Chapter01_SimpleFactoryPattern.ProductFactory creatProduct
    信息: 简单工厂==》创建了ProductC
    Disconnected from the target VM, address: '127.0.0.1:52152', transport: 'socket'
    十二月 28, 2016 5:27:12 下午 com.sedion.mynawang.Chapter01_SimpleFactoryPattern.ProductFactory creatProduct
    信息: 简单工厂==》没有这样的产品
    
    Process finished with exit code 0
    

      

     简单工厂模式优点

    1.通过引入配置文件,可以在不修改客户端代码的情况下更换和新加具体的产品类,一定程度上提高了灵活性。

    2.客户端无需知道创建的具体产品类的类名,有助于对复杂类名减少记忆量。

    3.对代码有明显的分工,工厂类负责制造产品类的实例,客户端负责使用该类。

     简单工厂模式缺点

    1.所有类都集中在工厂类中利用逻辑判断生成,所以该类会影响整个系统。

    2.简单工厂模式将会增加系统中类的个数,增加了系统的复杂度和理解难度。

    3.拓展相对困难,一旦新加产品就必须修改工厂类的逻辑,在产品类型较多时会造成工厂类的代码过于复杂。

    4.工厂类由于使用的是静态工厂方法,导致工厂角色无法形成基于继承的等级结构。

    简单工厂模式应用

    1.JDK类库中的java.text.DateFormat,用于格式化一个本地日期

    public final static DateFormat getDateInstance();
    public final static DateFormat getDateInstance(int style);
    public final static DateFormat getDateInstance(int style,Locale locale);

    2.DESEncrypt.java中获取加密的密钥生成器等

    KeyGenerator keyGen=KeyGenerator.getInstance("DESede");

    样例代码访问地址:https://github.com/mynawang/Design-Pattern-Learning/tree/master/src/main/java/com/sedion/mynawang/Chapter01_SimpleFactoryPattern

     
     
    博主自白

        本人20有余,天资愚钝,深信勤能补拙。酷爱编程,爱钻研,广交码友,耕于三线,日以继夜而使飞燕之身蜕变为大腹便便。


    有志之士点击链接加入技术交流群【专注的程序猿】282087535


        文章如果对你有所帮助是我的荣幸,不妥之处希望指正,转帖请注明本文出自钰火的小栈(http://www.mynawang.com/),请尊重他人的辛勤劳动成果,谢谢!

  • 相关阅读:
    arguments.callee
    vue的生命周期
    Vue中的v-cloak用法
    控制input只能输入数字和两位小数
    css3新单位vw、vh的使用详解
    关于图片的Base64编码
    Logic and Fault simulation
    scan design flow(二)
    scan design flow(一)
    异构计算
  • 原文地址:https://www.cnblogs.com/Codenewbie/p/6230944.html
Copyright © 2011-2022 走看看