磊哥学设计模式(二)工厂模式

工厂模式

什么是工厂模式

工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品

为什么要用工厂模式

  1. 为了解耦,把对象的创建和使用的过程分开。就是Class A 想调用 Class B ,那么A只是调用B的方法,而不用实例化Class B。
  2. 降低代码重复量,提高程序的可扩展性。也就是说,创建对象的代码,都放到工厂里面。

代码演示

下面就来演示下,使用工厂模式。
首先,先举个例子,比如一个游戏,有两种攻击方式,魔法攻击和物理攻击,那么我们很容易就写出代码来:

普通代码

public class OldAttack {
	void magic(){
		System.out.println("magic attack!");
	}
	
	void Physical(){
		System.out.println("Physical attack!");
	}
}

然后在主函数调用:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		OldAttack a = new OldAttack();
		a.magic();
	}

}

很简单,对不对,好现在问题来了,需要A,B,C,D四个对象来执行攻击,也很容易,马上就可以写出下面的代码:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		OldAttack a = new OldAttack();
		a.magic();
		
		OldAttack b = new OldAttack();
		b.magic();
		
		OldAttack c = new OldAttack();
		c.magic();
		
		OldAttack d = new OldAttack();
		d.magic();
	}

}

好,现在需求又改了,需要有初始的参数,那么就要改变如下:

public class OldAttack {
	void magic(){
		System.out.println("magic attack!");
	}
	
	void Physical(){
		System.out.println("Physical attack!");
	}
	OldAttack(int a,int b,int c,int d){
		
	}
}

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		OldAttack a = new OldAttack(1,2,3,4);
		a.magic();
		
		OldAttack b = new OldAttack(1,2,3,4);
		b.magic();
		
		OldAttack c = new OldAttack(1,2,3,4);
		c.magic();
		
		OldAttack d = new OldAttack(1,2,3,4);
		d.magic();
	}

}

工厂模式代码

改变就要如上,逐个更改,每一个对象的初始化都要加上参数,现在代码比较简单,改起来还算容易,但是要是有更多的代码呢,对于一个工程来说,更改需求很正常,代码量大也很正常。但是改起来真的很麻烦,所以我们就想换一种方式来写:

public interface Attack {
	public void attack();
}

public class Magic implements Attack {

	@Override
	public void attack() {
		// TODO Auto-generated method stub
		System.out.println("Magic attack!");
	}

	Magic(int a,int b ,int c,int d){
		
	}
	
}
public class Physical implements Attack {

	@Override
	public void attack() {
		// TODO Auto-generated method stub
		 System.out.println("Physical attack!"); 
	}

	Physical(int a,int b,int c,int d){
		
	}
}
public interface Provider {
	public Attack toAttack();
}

public class MagicFactory implements Provider {

	@Override
	public Attack toAttack() {
		// TODO Auto-generated method stub
		return new Magic(1,2,3,4);
	}

}
public class PhysicalFactory implements Provider {

	@Override
	public Attack toAttack() {
		// TODO Auto-generated method stub
		return new Physical(1,2,3,4);
	}

}
public class FactoryTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Provider p = new MagicFactory();
		Attack a = p.toAttack();
		a.attack();
		
	}

}

如上代码就是,要改的时候只需要改实现类和工厂类,就可以,不影响主函数的使用,而且要扩展的时候,比如加一个特殊攻击,只需要再做个工厂类和实现类。
如下:

public class Special implements Attack {

	@Override
	public void attack() {
		// TODO Auto-generated method stub
		System.out.println("Special attack!");
	}

	Special(int a,int b,int c,int d){
		
	}
}

public class SpecialFactory implements Provider {

	@Override
	public Attack toAttack() {
		// TODO Auto-generated method stub
		return new Special(1,2,3,4);
	}

}
public class FactoryTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Provider p = new MagicFactory();
		Attack a = p.toAttack();
		a.attack();
		Provider p2 = new SpecialFactory();
		Attack a2 = p2.toAttack();
		a2.attack();
	}

}

看,扩展起来非常的方便。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值