工厂模式实例(顺便回忆反射机制的应用)

一、原理

反射机制的原理

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

工厂模式自述

所谓工厂模式,是说由某个产品类接口、产品实现类、工厂类、客户端(单元测试主类)构成的一个模式,大程度的降低了代码的耦合性。能够在创建新产品新功能时候,不去触碰原有的逻辑。同时不会对客户端暴露创建逻辑。这篇文章用理发来解释工厂模式的应用。

二 、工厂模式的应用

先写产品接口

public interface Hair {

    /**
     * design hair cutting
     */
    void draw();
}

这部分没有什么好说的 ,和平时的service层一样。创建接口,新建接口方法。
再写产品接口的实现类。
先假设,理发店里有左偏分发型 。

public class LeftHairImpl implements Hair {
    @Override
    public void draw() {
        System.out.println("-----左偏分-----");
    }
}

在实现类里实现了左偏分发型的创建。假如,不使用工厂模式,那么 ,客户端应该是这样的。

public class HairCutTest {
    public static void main(String[]args){
       HairInterface left = new LeftHair();
	   left.draw();
    }
}

结果是这样的。在这里插入图片描述
这样我们在客户端里暴露了我们创建发型的实现逻辑,不利于代码的维护。并且,每次有新的发型,还需要新建Hair,比如我们新建一个右偏分,就要在客户端里新建一个右偏分对象RightHair。

如果,引入了工厂模式

public class HairFactory {
	public HairInterface getHair(String key){
		if("left".equals(key)){
			return new LeftHair();			
		}else if("right".equals(key)){
			return new RightHair();
		}
		return null;
	}
}

那么,客户端应该是这样的。

public class HairCutTest {
	public static void main(String[] args){
		HairFactory factory = new HairFactory();
		HairInterface left =  factory.getHair("left");
		left.draw();
	}
}

运行结果还是一样的。
在这里插入图片描述
真不错!!!但是安装了 阿里巴巴开发编程规范,一直提醒这魔法值,太难受了奥。而且,每多一种发型,就得写一个else if,头秃!

魔法值:编程规范里提到说是莫名其妙出现的一个值。

改进下,用反射机制写。

public class HairFactory {
    public Hair getHairByClassKey(String className){
        try{
            return (Hair)Class.forName(className).newInstance();
        } catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

这里有简写代码。完整的应该这样:

try {
	Hair hair = (Hair)Class.forName(className).newInstance();
	return hair;
	}

在客户端应该是这样的。

public class HairCutTest {
    public static void main(String[]args){
        HairFactory factory = new HairFactory();
        Hair left = factory.getHairByClassKey("com.factoriespartten.hair.impl.LeftHairImpl");
        left.draw();
    }
}

运行结果是一样的。真香 !
在这里插入图片描述
抽象工厂先欠着!!!
但是打赏码不能欠着!!!
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值