1.概述
抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
根据"里氏替换原则",任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽线产品的具体子类的实例。
2.优缺点
优点:
抽象工厂隔离了具体类的生产,使得客户不需要知道什么被创建。
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
增加新的工具工厂和产品族很方便,无须修改已有系统,符合"开闭原则"
缺点:
增加新产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类。
应用实例:运用抽象工厂模式来创建1个手机类,其功能包括打电话和发信息。
项目目录结构图
Call.java
package com.xiaochen.call;
//打电话功能
public interface Call {
public void call();
}
QQCall.java
package com.xiaochen.call;
public class QQCall implements Call{
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println("This is QQ-call!");
}
}
Sendr.java
package com.xiaochen.sender;
//发短信功能
public interface Sender {
public void sender();
}
MailSender.java
package com.xiaochen.sender;
public class MailSender implements Sender{
@Override
public void sender() {
// TODO Auto-generated method stub
System.out.println("This is Mail-sender!");
}
}
Factory.java
package com.xiaochen.factory;
import com.xiaochen.call.Call;
import com.xiaochen.sender.Sender;
//创建出来的手机具有的功能包含打电话和发信息
public interface Factory {
//抽象工厂的两个产品族
Call produceCall();
Sender produceSender();
}
PhoneFactory.java
package com.xiaochen.factory;
import com.xiaochen.call.Call;
import com.xiaochen.call.QQCall;
import com.xiaochen.sender.MailSender;
import com.xiaochen.sender.Sender;
public class PhoneFactory implements Factory{
@Override
public Call produceCall() {
// TODO Auto-generated method stub
return new QQCall();
}
@Override
public Sender produceSender() {
// TODO Auto-generated method stub
return new MailSender();
}
}
Test.java
package com.xiaochen.factory;
import com.xiaochen.call.Call;
import com.xiaochen.sender.Sender;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Factory phone=new PhoneFactory();
Call call=phone.produceCall();
Sender sender=phone.produceSender();
call.call();
sender.sender();
}
}
运行结果图