【设计模式练习】工厂模式

1.  简单工厂

在接口和子类中,避免这两者之前的直接操作。加入工厂类,工厂类来负现生产出你需要的对象。

此以后的维护中,即便有新的子类继承了接口,但是你只需要关心工厂类把它生产出来即可。入口执行的代码可以不用变

这种简单的工厂在处理同一类产品的时候还是比较方便的 ,但是如果分类越细。则就不能这样使用了。比如苹果,我可以生产红富士也可以

生产将军等其化品种

package com.ryan;

interface Fruite {
	public abstract void eat();
}

class Apple implements Fruite {
	public void eat() {
		System.out.println("吃苹果");
	}
}

class Orange implements Fruite {
	public void eat() {
		System.out.println("吃橘子");
	}
}
//造各种水果
class Factory {
	public Fruite getFruite(String fruite) throws Exception {
		if(fruite.equals("Apple")) {
			return new Apple() ; 
		}else if(fruite.equals("Orange")) {
			return new Orange();
		}else {
			throw new Exception("没有此类水果");
		}
	}
}

public class TestFactoryMode {
	public static void main(String[] args) {
		try {
			new Factory().getFruite("Apple").eat();
			new Factory().getFruite("Orange").eat();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

上述方法还有一个缺陷就是当接口有更多的子类来继承的时候

工厂类也需要跟着修改,如果使用反射则可以解决这样的问题

需要注意的是子类需要有无参的构造方法

package com.ryan;

interface Fruite {
	public abstract void eat();
}

class Apple implements Fruite {
	public void eat() {
		System.out.println("吃苹果");
	}
}

class Orange implements Fruite {
	public void eat() {
		System.out.println("吃橘子");
	}
}

class Factory {
	public Fruite getFruite(String className) throws Exception {
		//使用反射后,只需要传入包.类名称当
		//当子类有扩展后,此工厂类也不需要修改
		Class<?> c =  Class.forName(className);
		Fruite instatnce = (Fruite)c.newInstance();
		
		return instatnce;
	}
	
}
public class TestFactoryMode {
	public static void main(String[] args) {
		try {
			new Factory().getFruite("com.ryan.Apple").eat();
			new Factory().getFruite("com.ryan.Orange").eat();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值