大家好,今天介绍一下工厂模式。首先,我们知道简单工厂模式的缺点,那就是它是写死的,拿我上个写得例子来说  简单工厂

如果要扩展的话,则要修改源代码,这样如果以后产生的Phone类型很多,那么就要一直修改,代码维护成本高(如果万一你哪个类型写错了怎么办)

所以出现了工厂模式。

工厂模式简单来说就是一个工厂对应一个产品。比如说IPhoneFactory产生IPhone系列的手机,XiaoMiFactory产生XiaoMi系列的手机。

让我们看看UML图吧。


看下代码吧

首先是Phone接口

package edu.fjnu.cs.hwb.factory;

public interface Phone
{
	void call();
}
然后是具体的实现类

首先是IPhone4的

package edu.fjnu.cs.hwb.factory;

import edu.fjnu.cs.hwb.factory.*;

public class IPhone4 implements Phone {

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println("i am iphone4");
	}

}
之后是IPhone4s的

package edu.fjnu.cs.hwb.factory;

import edu.fjnu.cs.hwb.factory.*;

public class IPhone4s implements Phone {

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println("i am iphone4s");
	}

}
之后是XiaoMi2的

package edu.fjnu.cs.hwb.factory;

import edu.fjnu.cs.hwb.factory.*;

public class XiaoMi2 implements Phone {

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println("i am xiaomi2");
	}

}

之后是XiaoMi2s的

package edu.fjnu.cs.hwb.factory;

import edu.fjnu.cs.hwb.factory.*;

public class XiaoMi2s implements Phone {

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println("i am xiaomi2s");
	}

}
好了,现在看看工厂吧
首先是工厂接口
package edu.fjnu.cs.hwb.factory;
//定义工厂接口
public interface PhoneFactory 
{
	Phone getPhone(String name);
}
在看看对应的工厂

首先是IPhone的工厂

package edu.fjnu.cs.hwb.factory;

public class IPhoneFactory implements PhoneFactory 
{

	 
	public   Phone getPhone(String name) 
	{
		Phone phone = null;
		if(name.equalsIgnoreCase("iphone4"))
		{
			phone = new IPhone4();
		}
		else if(name.equalsIgnoreCase("iphone4s"))
		{
			phone = new IPhone4s();
		}
		else
		{
			throw new RuntimeException("没有该类型的手机");
		}
		return phone;
	}

}

之后是XiaoMi工厂
package edu.fjnu.cs.hwb.factory;

public class XiaoMiFactory implements PhoneFactory {

	@Override
	public Phone getPhone(String name) 
	{		
		Phone phone = null;
		if(name.equalsIgnoreCase("xiaomi2"))
		{
			phone = new XiaoMi2();
		}
		else if(name.equalsIgnoreCase("xiaomi2s"))
		{
			phone = new XiaoMi2s();
		}
		else
		{
			throw new RuntimeException("没有该类型的手机");
		}
		return phone;
	}

}

在看看客户端怎么使用

package edu.fjnu.cs.hwb.factory;
 
/**
 * 
 * 工厂模式:
 * 抽象出一个工厂,还有手机类
 * 分门别类的为每个手机做一个工厂,该工厂专门为某个手机服务
 */
public class Client
{
	public static void main(String[] args)
	{
		PhoneFactory phoneFactory = new IPhoneFactory();
		Phone phone = phoneFactory.getPhone("Iphone4s");
		phone.call();
		
		phone = phoneFactory.getPhone("iphone4");
		phone.call();
		
		
		
		phoneFactory = new XiaoMiFactory();
		phone = phoneFactory.getPhone("xiaomi2");
		phone.call();
		phone = phoneFactory.getPhone("xiaomi2s");
		phone.call();
		
		try{
			phoneFactory = new XiaoMiFactory();
			phone = phoneFactory.getPhone("xiaomi2w");
			phone.call();
			phone = phoneFactory.getPhone("xiaomi2s");
			phone.call();
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	
	}
}
结果



总结一下:工厂模式比简单工厂好一点,至少它容易扩展了。但是如果有多个产品的话,那么不就意味这要弄多个工厂?(假设我们现在需要Computer,那就意味着还要写多个工厂),所以就会出现了抽象工厂设计模式,抽象工厂就是要针对产品族的!

下次再讲抽象工厂。

如果有讲不对的,请指出来。


Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐