工厂模式学习笔记

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

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

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

加载配置文件:

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;
    }
}

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

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

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

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

工厂模式的好处:

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

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

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

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

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

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

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

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值