工厂模式学习笔记

来源:互联网 发布:淘宝网淘宝商城 编辑:程序博客网 时间:2024/05/22 15:39

工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类时哪一个,工厂方法让类把实例化推迟到子类。

工厂方法模式能够封装具体类型的实例化。

将创建对象的代码集中在一个对象或方法中,可以避免代码中的重复,并且更方便以后的维护。这也意味着客户在实例化对象时,只会依赖于接口,而不是具体类。可以帮助我们针对接口编程。而不针对实现编程。让代码更具有弹性,可以应对未来的扩展。

加载配置文件:

package com.zsq.project;import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class PropertiesRead {    private static Properties properties = new Properties();    static {        try {            try (InputStream is = PropertiesRead.class.getResourceAsStream("type.properties")) {                properties.load(is);            }        } catch (IOException e) {            e.printStackTrace();        }    }    public static Properties getProperties() {        return properties;    }}
配置文件内容;
left=com.zsq.project.LeftHair
生成对象的实现方式如下:
package com.zsq.project;/** * 发型工厂 */public class HairFactory {    /**     * 根据类型来创建对象     *     * @param key     * @return     */    public HairInterface getHair(String key) {        if ("left".equals(key)) {            return new LeftHair();        } else if ("right".equals(key)) {            return new RightHair();        }        return null;    }    public HairInterface getHairByClassKey(String key) {        try {            return (HairInterface) Class.forName(PropertiesRead.getProperties().getProperty(key)).newInstance();        } catch (InstantiationException e) {            e.printStackTrace();        } catch (IllegalAccessException e) {            e.printStackTrace();        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        return null;    }    public HairInterface getHairByClass(String className) {        try {            HairInterface hair = (HairInterface) Class.forName(className).newInstance();            return hair;        } catch (InstantiationException e) {            e.printStackTrace();        } catch (IllegalAccessException e) {            e.printStackTrace();        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        return null;    }    public HairInterface getHairByClass(Class<? extends HairInterface> clazz) {        try {            return clazz.newInstance();        } catch (InstantiationException e) {            e.printStackTrace();        } catch (IllegalAccessException e) {            e.printStackTrace();        }        return null;    }}

视频地址

通用工厂类:

public class FactoryTest<T> {    public T getInstance(Class<? extends T> t) {        try {            return t.newInstance();        } catch (InstantiationException e) {            e.printStackTrace();        } catch (IllegalAccessException e) {            e.printStackTrace();        }        return null;    }}

工厂方式模式和抽象工厂模式对比:

①工厂模式一种极端情况的抽象工厂模式,而抽象工厂模式可以看成是工厂模式的推广

②工厂模式用来创建一个产品的等级架构,而抽象工厂模式是用来创建多个产品的等级架构

③工厂模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类

工厂模式的好处:

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

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

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

工厂模式适用于哪些场景:

①一个系统应当不依赖于产品类实例被创立,组成,和表示的细节,这对于所有形态的工厂模式都是重要的

②这个系统的产品有至少一个的产品族

③同属于同一个产品族的产品是设计成在一起使用的,这一约束必须得在系统的设计中体现出来

④不同的产品以一系列的接口的面貌出现,从而使系统不依赖于接口实现的细节