《Design Patterns》SimpleFactory.积跬步系列

SimpleFactory:简单工厂模式

先代码

父类或接口类:

package h.l.demo.simplefactory;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: Demo--简单工厂模式
 * SuperClassOrInterface:表示父类或者接口都行,此处两者代码都会给出,大同小异
 */
/*public abstract class SuperClassOrInterface {
	// 抽象方法
	public abstract void doSomeThings();
	// 非抽象方法
	public void doThings(){
		System.out.println("SuperClassOrInterface:doThings...");
	}
}*/
public interface SuperClassOrInterface{
	public void doSomeThings();
}

子类或实现类(两个):

package h.l.demo.simplefactory;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: 子类1:继承或实现
 */
/*public class SubClassOrImplClass1 extends SuperClassOrInterface {

	*//**
	 * 实现抽象方法
	 *//*
	@Override
	public void doSomeThings() {
		// TODO Auto-generated method stub
		System.out.println("SubClassOrImplClass1:doSomeThings...");
	}
	*//**
	 * 子类重写父类方法
	 * @Override 可以校验该方法是不是在父类(超类)中存在
	 *//*
	@Override
	public void doThings(){
		System.out.println("SubClassOrImplClass1:doThings...");
	}
}*/
public class SubClassOrImplClass1 implements SuperClassOrInterface {

	/**
	 * 实现接口中指定的行为
	 */
	@Override
	public void doSomeThings() {
		// TODO Auto-generated method stub
		System.out.println("SubClassOrImplClass1:doSomeThings...");
	}
}
package h.l.demo.simplefactory;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: 子类2:继承或实现
 */
/*public class SubClassOrImplClass2 extends SuperClassOrInterface {
	*//**
	 * 实现抽象方法
	 *//*
	@Override
	public void doSomeThings() {
		// TODO Auto-generated method stub
		System.out.println("SubClassOrImplClass2:doSomeThings...");
	}
	*//**
	 * 子类重写父类方法
	 * @Override 可以校验该方法是不是在父类(超类)中存在
	 *//*
	@Override
	public void doThings(){
		System.out.println("SubClassOrImplClass2:doThings...");
	}
}*/
public class SubClassOrImplClass2 implements SuperClassOrInterface {

	/**
	 * 实现接口中指定的行为
	 */
	@Override
	public void doSomeThings() {
		// TODO Auto-generated method stub
		System.out.println("SubClassOrImplClass2:doSomeThings...");
	}
}

工厂类:

package h.l.demo.simplefactory;

/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: 工厂类
 */
public class SimpleFactory {
	/**
	 * 通过工厂获取实例
	 * @param subType 子类型
	 * @return
	 */
	public static SuperClassOrInterface getInstance(String subType) {
		SuperClassOrInterface si = null;
		switch (subType) {
		case "SubClassOrImplClass1":
			si = new SubClassOrImplClass1();
			break;
		case "SubClassOrImplClass2":
			si = new SubClassOrImplClass2();
			break;
		}
		return si;
	}
}

测试类:

package h.l.demo.simplefactory;
/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年1月31日
 * @Description: 测试
 */
public class TestMainEnter {

	public static void main(String[] args) {
		SuperClassOrInterface si = SimpleFactory.getInstance("SubClassOrImplClass1");
		si.doSomeThings();
		// si.doThings();
		System.out.println("-----------------------");
		si = SimpleFactory.getInstance("SubClassOrImplClass2");
		si.doSomeThings();
		// si.doThings();
	}

}

测试结果:
在这里插入图片描述

后分析

  • 个人建议:写代码是件幸福的事,So,do it

简单工厂模式,联系生活实际,可以类比于现实中的大米加工厂。这个加工厂收来自各个村庄的大米,甲村庄的大米是圆颗粒香糯型的,乙村庄的大米是长颗粒爽口型的,丙村庄的大米是低糖干瘪型的,丁村庄的大米则是圆润饱满型的。现实生活中是,大家会去加工厂挑选我们自己想要吃的哪种大米,很少有人会直接去个村庄农民伯伯家买大米吧。大伙都是直接向加工厂提要求:我要长颗粒爽口型的大米,那加工厂就会把乙村庄的大米卖给你;我血糖有些偏高,我需要低糖干瘪型的大米,那加工厂就会把丙村庄的大米提供给你。这个过程有没有发现,我们所买到的大米,实际上完全不关心他来自哪里。我们只需要向加工厂提要求就可以,至于我们要的大米来自哪里,这个由加工厂去找去负责。
实际上,简单工厂模式就是这个道理。我们可以将n个类的公共方法或者行为抽取出来作为父类的抽象方法或接口,由子类对抽象方法或接口进行实现。对于不同子类的创建,我们不在是new一个子类对象,而是将new的过程全权交由工厂去操作。被实例化类则对调用者屏蔽。

其他例子:参考自《大话设计模式》
如写一个计算器加减乘除,实际上都是对两个操作数据进行操作然后得出结论。更为准确的说,加减乘除都是对操作数据的操作行为。那么这个行为就应该被定义在接口中,由各个操作类中进行实现。因为子类很多,为了对调用者友好(不希望调用者要很辛苦的去记得调用加法方法得去new加运算的类,减法由去new一个减运算的类),我们通过工厂给了一个统一的入口,调用者将运算符传入,我们给他返回对应的运算类即可。好处嘛:挺明显,比new A();new B();new 啊不次的();方便多了吧。可千万别说不就个加减乘除嘛,我全写在main方法中,一个方法搞定,那我不敢出声了,自个加油。


注:以上文章仅是个人总结,若有不当之处,望不吝赐教

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值