目录
摘要:
学习这三个工厂模式时,一定要抓住,工厂这个关键字,它象征着,我们可以在现实领域里工厂中找到对应的例子;
一:模式说明
抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类;(我对其理解是:创建单一对象的的工厂可以叫工厂模式,抽象则是对多个对象的创建,叫抽象工厂;取决于创建对象的种类区别)
二:UML类图
三:代码示例:(小米和苹果举例)
抽象工厂 IFactory:
public interface IFactory {
/**
* createComputer:(创建电脑产品工厂). <br/>
*
* @author:Jason Li Date: 2019年6月9日 上午10:39:39
* @return
* @since JDK 1.8
*/
public IComputer createComputer();
/**
* createMobileTelephonoe:(创建手机产品工厂). <br/>
*
* @author:Jason Li Date: 2019年6月9日 上午10:40:04
* @return
* @since JDK 1.8
*/
public IMobileTelephonoe createMobileTelephonoe();
}
工厂实现类:小米工厂
/**
* ClassName:MIFactory <br/>
* Description: 小米工厂. <br/>
* Date: 2019年6月9日 上午10:41:07 <br/>
*
* @author Jason Li
* @version
* @since JDK 1.8
* @see
*/
public class MIFactory implements IFactory {
@Override
public IComputer createComputer() {
return new MIComputer();
}
@Override
public IMobileTelephonoe createMobileTelephonoe() {
return new MIMobileTelephonoe();
}
}
苹果工厂:
/**
* ClassName:AppleFactory <br/>
* Description: 苹果工厂. <br/>
* Date: 2019年6月18日 下午9:25:20 <br/>
*
* @author Jason Li
* @version
* @since JDK 1.8
* @see
*/
public class AppleFactory implements IFactory {
@Override
public IComputer createComputer() {
return new IMac();
}
@Override
public IMobileTelephonoe createMobileTelephonoe() {
return new IPhone();
}
}
两个抽象产品:手机接口和笔记本接口
/**
* ClassName:IDepartment <br/>
* Description: 电脑. <br/>
* Date: 2018年7月30日 下午10:26:47 <br/>
*
* @author Jason Li
* @version
* @since JDK 1.8
* @see
*/
public interface IComputer {
/**
* shutdown:(关机). <br/>
*
* @author:Jason Li Date: 2019年6月18日 下午9:43:22
* @since JDK 1.8
*/
void shutdown();
/**
* startingUp:(开机). <br/>
*
* @author:Jason Li Date: 2019年6月18日 下午9:44:04
* @since JDK 1.8
*/
void startingUp();
}
**
* ClassName:IUser <br/>
* Description: 手机. <br/>
* Date: 2018年7月30日 下午10:25:47 <br/>
*
* @author Jason Li
* @version
* @since JDK 1.8
* @see
*/
public interface IMobileTelephonoe {
/**
* call:(打电话). <br/>
*
* @author:Jason Li Date: 2019年6月18日 下午10:27:07
* @since JDK 1.8
*/
void call();
/**
* sendMessage:(这里用一句话描述这个方法的作用). <br/>
*
* @author:Jason Li Date: 2019年6月18日 下午10:27:21
* @since JDK 1.8
*/
void sendMessage();
}
小米的具体产品:小米电脑
/**
* ClassName:MiComputer <br/>
* Description: 小米电脑. <br/>
* Date: 2019年6月18日 下午9:44:45 <br/>
*
* @author Jason Li
* @version
* @since JDK 1.8
* @see
*/
public class MIComputer implements IComputer {
@Override
public void shutdown() {
System.out.println("小米电脑关机");
}
@Override
public void startingUp() {
System.out.println("小米电脑开机");
}
}
小米手机:
/**
* ClassName:MIMobileTelephonoe <br/>
* Description: 小米手机. <br/>
* Date: 2019年6月18日 下午9:48:44 <br/>
*
* @author Jason Li
* @version
* @since JDK 1.8
* @see
*/
public class MIMobileTelephonoe implements IMobileTelephonoe {
@Override
public void call() {
System.out.println("小米手机开始呼叫");
}
@Override
public void sendMessage() {
System.out.println("小米手机开送消息");
}
}
苹果具体产品:苹果电脑
/**
* ClassName:IMac <br/>
* Description: 苹果电脑. <br/>
* Date: 2019年6月18日 下午9:50:28 <br/>
*
* @author Jason Li
* @version
* @since JDK 1.8
* @see
*/
public class IMac implements IComputer {
@Override
public void shutdown() {
System.out.println("IMac开始关机");
}
@Override
public void startingUp() {
System.out.println("IMac开始开机");
}
}
苹果手机:
/**
* ClassName:IPhone <br/>
* Description: 苹果手机. <br/>
* Date: 2019年6月18日 下午9:49:41 <br/>
*
* @author Jason Li
* @version
* @since JDK 1.8
* @see
*/
public class IPhone implements IMobileTelephonoe {
@Override
public void call() {
System.out.println("iPhone开始呼叫");
}
@Override
public void sendMessage() {
System.out.println("iPhone开始发送信息");
}
}
测试类:ClientTest
/**
* ClassName:ClientTest <br/>
* Description: TODO Description. <br/>
* Date: 2018年8月1日 下午12:59:27 <br/>
*
* @author Jason Li
* @version
* @since JDK 1.8
* @see
*/
public class ClientTest {
@Test
public void test() {
//如果是生产厂家为小米
IFactory miFactory = new MIFactory();
IComputer miComputer = miFactory.createComputer();
System.out.println("开机:");
miComputer.startingUp();
IMobileTelephonoe miPhone = miFactory.createMobileTelephonoe();
System.out.println("打电话:");
miPhone.call();
//如果是生产厂家为苹果
IFactory appleFactory = new AppleFactory();
IComputer imac = appleFactory.createComputer();
System.out.println("开机:");
imac.startingUp();
IMobileTelephonoe iPhone = appleFactory.createMobileTelephonoe();
System.out.println("打电话:");
iPhone.call();
}
}
四:适用范围及优缺点
适用范围:抽象工厂适用于创建多个产品系列的产品;
优点:1:易于更换产品系列,比如我们将小米更换为苹果,只需要将 工厂实现的对象指定到苹果工厂;
2:创建对象的过程和客户端相分离,具体产品不会出现在客户端
缺点:代码繁琐,每增加一个产品系列,就要增加对应工厂的具体产品类;例如:增加电视产品,修改IFactory、AppleFactory、MIFactory 新增TV 抽象产品接口、MITV、ITV这样繁琐的修改和新增,任务量会很大;