简单工厂、工厂方法与抽象工厂

本文参考的书籍是:大话设计模式
先说说三者的概念,是大家有一个大体的了解

简单工厂模式:创建一个工厂类,由这个工厂类去决定到底实例化哪一个对象(注:简单工厂模式不是23种设计模式之一)
工厂方法模式:工厂方法模式是简单工厂模式的进一步扩展,创建一个抽象工厂(工厂里仅仅有一个创建抽象产品的方法),所有的具体工厂均需要实现这个抽象工厂。工厂方法模式利用多态使得一个类的实例化延迟到子类。
抽象工厂模式:抽象工厂模式是工厂方法模式的扩展,创建一个抽象工厂(工厂里有多个创建抽象产品的方法),其余一样。

简单工厂类:
public class SimpleFactory {
	public static LeiFei createGoodMan(String type){
		LeiFei good_man  = null;
		switch (type) {
		case "大学生":
			good_man = new Undergraduate();
			break;
		case "志愿者":
			good_man = new Volunteer();
			break;
		}
		
		return good_man;
	}
}
但是它也存在着一定的缺点——就是违背了对扩展开放,对修改封闭的原则。
当需要添加要实例化的类型时,只需要修改添加case语句即可,完全屏蔽了客户端与具体实例之间的依赖关系,但是它也存在着一定的缺点——就是违背了对扩展开放,对修改封闭的原则。
为了弥补这个缺点,有引入了工厂方法模式。

工厂方法:
可以先创建一个工厂接口:
public interface Factory {
	public LeiFei createGoodMan();
}
然后创建各种实现类,用来进行实例化各种具体的类:
public class UndergraduateFactory implements Factory{

	@Override
	public LeiFei createGoodMan() {
		// TODO Auto-generated method stub
		return new Undergraduate();
	}

}

public class VolunteerFactory implements Factory{

	@Override
	public LeiFei createGoodMan() {
		// TODO Auto-generated method stub
		return new Volunteer();
	}
	

}
当我们继续添加需要实例化的类型时,只需要创建实现Factory接口的子类即可。
这样也符合了开放——关闭原则了。
所以可以这么说工厂方法模式是简单工厂模式的进一步优化。
但是这同样存在一个问题:正如现实中的工厂一样,有的工厂不可能仅仅只生产一种产品,可能生产一系列的产品,如Apple不仅生产iPhone而且也生产iWatch一样
为了解决这个问题,又对工厂方法模式进行了扩展,形成了抽象工厂模式

抽象工厂模式:
先创建一个抽象工厂:
interface IFactory{
	public Iphone createPhone();
	public Iwatch createWatch();
}
由具体的工厂来生产具体的产品
class Apple implements IFactory{

	@Override
	public Phone createPhone() {
		// TODO Auto-generated method stub
		//生产IPhone手机
		return new Iphone();
	}

	@Override
	public Watch createWatch() {
		// TODO Auto-generated method stub
		//生产iWatch
		return new Iwatch();
	}	
}
在客户端我们可以这样写
class Client{
	public static void main(String[] args) {
		IFactory factory = new Apple();
		factory.createPhone();
		factory.createWatch();
	}
}
简单工厂最大的好处就是:便于改变产品系列。当我们此时想生产华为的手机与智能手表是,只需要添加具体的Huawei类,并且实现IFactory接口,然后修改客户端代码成为如下所示即可:
class Client{
	public static void main(String[] args) {
		IFactory factory = new Huawei();
		factory.createPhone();
		factory.createWatch();
	}
}
这符合 开放——关闭原则。

总结:
总的来说,简单工厂模式相当于在一个工厂生产多个具体的产品,并且由简单工厂来决定生产哪一个产品——但是当需要添加产品的时候,会破坏开放关闭原则,因为需要修改简单工厂类;
工厂方法模式相当于一个工厂只生产一种具体的产品,这弥补了简单工厂模式的不足。
抽象工厂模式是相当于一个集团,下面有多子公司,这些子公司可以生产不止一种具体产品。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值