• Java基础知识之设计模式--工厂模式


    Java设计模式--工厂模式

    声明:本文根据慕课网卜奇老师的精品课程整理来的:慕课网

     什么是设计模式(Design Pattern)?

      设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。

    什么情况下使用工厂模式?

      有一组类似的对象需要创建。

      在编码时不能预见需要创建哪种类的实例。

      系统需要考虑扩展性,不应依赖于产品类实例如何被创建,组合和表达的细节。

    工厂模式的分类?

      工厂模式和抽象工厂模式

    工厂模式常见的应用场景?

      JDBC的实现,spring框架中Bean的实例化。

    工厂模式的实现对我们有什么帮助?

      系统可以在不修改具体工厂角色的情况下引进新的产品

      客户端不必关心对象如何创建,明确了职责

      更好的理解了面向对象的原则,面向接口编程,而不是面向实现编程

    通过一个工厂模式的例子来深入理解工厂模式的应用

      1.首先创建一个接口,这个接口是所有具体功能的基础接口

      

    1 public interface HairInterface {
    2     /**
    3      * 定义接口方法
    4      */
    5     public void draw();
    6 }

      2.创建三个接口的实现

      

    1 public class RightHair implements HairInterface {
    2     @Override
    3     public void draw() {
    4         System.out.println("-------右偏分发型-----");
    5     }
    6 }

      

    1 public class LeftHair implements HairInterface {
    2     @Override
    3     public void draw() {
    4         System.out.println("-------左偏分发型------");
    5     }
    6 }

      

    1 public class InHair implements HairInterface {
    2     @Override
    3     public void draw() {
    4         System.out.println("-------中分发型-----");
    5     }
    6 }

      3.创建配置文件,确定映射关系

      4.创建读取配置文件的工具类

      

     1 public class PropertiesReader {
     2     public Map<String, String> getProperties() {
     3         Properties props = new Properties();
     4         Map<String, String> map = new HashMap<String, String>();
     5         try {
     6             InputStream in = getClass().getResourceAsStream("type.properties");
     7             props.load(in);
     8             Enumeration en = props.propertyNames();
     9             while (en.hasMoreElements()) {
    10                 String key = (String) en.nextElement();
    11                 String property = props.getProperty(key);
    12                 map.put(key, property);
    13                 // System.out.println(key + " " + property);
    14             }
    15         } catch (Exception e) {
    16             e.printStackTrace();
    17         }
    18         return map;
    19     }
    20 }

      5.创建工厂方法,进行类的实例化

      

     1 public class HairFactory {
     2     /**
     3      * 根据类型来创建对象
     4      * @Description: TODO
     5      * @param key
     6      * @return
     7      * @returnType: HairInterface
     8      */
     9     public HairInterface getHair(String key){
    10         try {
    11             //通过读取工具类获取properties文件的配置信息
    12             Map<String,String> map = new PropertiesReader().getProperties();
    13             //根据映射获取类的路径
    14             HairInterface hairInterface = (HairInterface) Class.forName(map.get(key)).newInstance();
    15             if(hairInterface!=null){
    16                 return hairInterface;
    17             }
    18         } catch (InstantiationException e) {
    19             e.printStackTrace();
    20         } catch (IllegalAccessException e) {
    21             e.printStackTrace();
    22         } catch (ClassNotFoundException e) {
    23             e.printStackTrace();
    24         }
    25         return null;
    26     }
    27 }

      6.编写测试类,进行功能实现

      

    public class Test {
        public static void main(String[] args) {
            //创建工厂类实例
            HairFactory factory= new HairFactory();
            //根据配置文件信息获取具体实例
            HairInterface interfaceImpl = factory.getHair("in");
            if(interfaceImpl !=null)
                interfaceImpl.draw();
        }
    }

      7.测试结果,成功实例化对象,实现方法

  • 相关阅读:
    这是在CNblogs倒闭前,本blog最后一篇随笔,请各位看官好好珍惜,主题:改变Docker Port 2376从你我做起,有图为证
    娱乐往事,年初捡到1G PAR,平淡的日子泛起波澜(小编,今天你移了多少次了?给一个说法吧,置顶了)
    DOCKER绝对领域从2048到4069?不:25519,数字的飞跃,HTTP/2
    再次聚焦DOCKER MACHINE CODE 2048
    视觉光盘,只有我可以贴全世界唯一,Windows上最高级的DOCKER客户端数字, 夜晚点击一个都没有,值班的小编辛苦了
    视觉光盘,只有我可以贴全世界唯一,你永远截不到的图片(小编请用人性化语言解释移出首页)
    深夜话题boot2docker还有那些隐藏MENU
    Go Goosy Disk Docker Port Provisioners (GDP)
    揭发233的docker/machine
    手动滑稽之golang-vmware-driver广告篇
  • 原文地址:https://www.cnblogs.com/wk-missQ1/p/12304521.html
Copyright © 2020-2023  润新知