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.测试结果,成功实例化对象,实现方法

原文地址:https://www.cnblogs.com/wk-missQ1/p/12304521.html