人人都能看懂的工厂方法模式和抽象工厂模式的区别

设计模式中的工厂方法模式和抽象工厂模式一直不知不觉地使用在程序设计中,但是就是经常只有实践没有进行理论指导,所以感觉有一点半路子出家而没有系统学习过的不踏实的感觉。现在总结了一下之前项目中使用过的抽象工厂模式,加强对创建型模式中工厂模式的理解。

先举个栗子感性的理解工厂方法模式和抽象工厂模式这两者的区别。

有一个富商,在深圳开了三个手机厂,分别代工苹果手机,三星手机,华为手机。富商经常视察这3个厂,在苹果手机厂就说“大家要做好苹果手机”,在三星厂就说“大家要做好三星手机”,在华为厂就说“大家要做好华为手机”。这样不是很符合常理。按常理来说,视察工厂的时候只要说“大家要做好手机”。既然是富商,肯定不至于蠢成这样。那么按照程序设计中的面向对象思想来看就可以简化为工厂模式,现在先用简单工厂模式实现:


简单工厂模式实现

public interface PhoneFactory{
	public void makePhone();
}

public class IPhone implement PhoneFactory{
	public void makePhone(){
		System.out.println("Make a best IPhone ");
	}
}

public class Samsung implement PhoneFactory{
	public void makePhone(){
		System.out.println("Make a best Samsung ");
	}
}

public class Huawei implement PhoneFactory{
	public void makePhone(){
		System.out.println("Make a best Huawei ");
	}
}

public class Factory{
	public static gotoPhone(String phone){
		if(phone.equal("Iphone")){
			return new IPhone();
		}else if(phone.equal("Samsung")){
			return new Samsung();
		}else{
			return new Huawei();
		}
	}
}

public class Boss{
       public static void main(String[] args){
		PhoneFactory factory = Factory.gotoPhone("Iphone");
		factory.makePhone();
       }
}

可以看到简单的工厂模式就是根据if判断语句进行区分的,这样客户端免除了直接创建产品对象的责任,而仅仅负责“消费”产品(正如手机厂老板所为)。加入现在需要加入中兴手机呢,下面我们从开闭原则(对扩展开放;对修改封闭)上来分析下简单工厂模式。如果需要加入中兴手机,那么就需要修改Factory中的gotoPhone(String),加入一个if分支,这样明显就是修改了,违背了开闭原则中的对修改封闭,同时也是因为程序中使用if判断语句进行分类导致的对扩展不够。所以现在我们使用工厂方法模式,直接去掉中间的Factory


工厂方法模式实现

public interface PhoneFactory{
	public void makePhone();
}

public class IPhone implement PhoneFactory{
	public void makePhone(){
		System.out.println("Make a best IPhone ");
	}
}

public class Samsung implement PhoneFactory{
	public void makePhone(){
		System.out.println("Make a best Samsung ");
	}
}

public class Huawei implement PhoneFactory{
	public void makePhone(){
		System.out.println("Make a best Huawei ");
	}
}
public class Boss{
       public static void main(String[] args){
		PhoneFactory factory = new IPhone();
		factory.makePhone();
       }
}
现在可以看出,还要增加中兴手机就不要修改代码了,直接就是可以实现一个中兴手机的PhoneFactory就可以了。刚好没有修改任何代码,直接就是增加一个实现类。如果哪天中兴手机代工厂关闭了,那么就有直接删掉中兴代工厂的类就好了,也不至于修改其它类。

那么这里继续讲到抽象方法
如果现在工厂想改成做手机配件,分别生产iPhone的耳机和贴膜,那么就需要先把原先工厂改成产零件的工厂,然后再生产相对应的零件:


抽象工厂模式实现

public interface PhoneFactory{
	public void makePhonePart();
}

public class IPhone implement PhoneFactory{
	public IPhonePart makePhonePart(){
		return new IPhonePart();
	}
}

public class Samsung implement PhoneFactory{
	public SamsungPart makePhonePart(){
		return new SamsungPart();
	}
}

public class Huawei implement PhoneFactory{
	public HuaweiPart makePhonePart(){
		return new HuaweiPart();
	}
}
 
public interface PhonePart{
	public void makeEarPhone();
	public void makeScreenTheca();
}

public class IPhonePart implement PhonePart{
	public void makeEarPhone(){
		System.out.println("Make a best IPhone ");
	}
	public void makeScreenTheca(){
		System.out.println("Make a best IPhone ");
	}
}

public class SamsungPart implement PhonePart{
	public void makeEarPhone(){
		System.out.println("Make a best IPhone ");
	}
	public void makeScreenTheca(){
		System.out.println("Make a best IPhone ");
	}
}

public class HuaweiPart implement PhonePart{
	public void makeEarPhone(){
		System.out.println("Make a best IPhone ");
	}
	public void makeScreenTheca(){
		System.out.println("Make a best IPhone ");
	}
}


public class Boss{
       public static void main(String[] args){
		PhoneFactory factory = new IPhone();
		factory.makePhonePart();
		factory.makeEarPhone();
		factory.makeScreenTheca();
       }
}

那么这里的PhoneFactory作为抽象工厂的一层实现PhonePart这一层才是真正的生产产品。

可以看出抽象工厂有多个产零件的具体工厂类,他们就是从一个抽象工厂类中抽象出来的。然后这里的每个具体的手机零件工厂类可以创建多个具体的产品类(产品类实例)。

相对于工厂方法而言,就是少了一层,就是一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类只能创建一个具体产品类的实例。


原创来自csdn博客http://blog.csdn.net/dreamintheworld/article/details/42928079




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值