简单工厂模式/静态工厂方法(创建型设计模式)
要点:
只关注接口,不关注对象创建细节。
创建过程与使用过程相分离。
优点:
实现了对象的创建与使用的分离;
客户端只需要知道参数即可;
通过引入配置文件提高了系统灵活性。
缺点:
工厂类职责过重;
增加了系统中类的个数,增加了系统复杂度;
系统扩展困难;
工厂角色无法形成基于继承的等级结构,不易扩展。
适用环境:
工厂类负责创建的对象较少,且客户端只知道参数。
实例1:三种支付方式的实现。
类图
代码实现:
代码结构:
AbstractPay.java:
public abstract class AbstractPay {
public abstract void pay();
}
CashPay.java:
public class CashPay extends AbstractPay{
public void pay(){
System.out.println("cash pay!");
}
}
CreditcardPay.java:
public class CreditcardPay extends AbstractPay{
public void pay(){
System.out.println("Creditcard pay!");
}
}
VoucherPay.java:
public class VoucherPay extends AbstractPay{
public void pay(){
System.out.println("voucher pay!");
}
}
PayMethodFactory.java:
import PayMethod.AbstractPay;
import PayMethod.CashPay;
import PayMethod.CreditcardPay;
import PayMethod.VoucherPay;
public class PayMethodFactory {
public static AbstractPay getPayMethod(String type) {
if (type.equalsIgnoreCase("cash")) {
return new CashPay();
} else if (type.equalsIgnoreCase("creditcard")) {
return new CreditcardPay();
}else {
return new VoucherPay();
}
}
}
XMLUtils.java:
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.File;
public class XMLUtils {
public static String getPayName(){
try {
//创建文档对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document;
document = documentBuilder.parse(new File("src/Utils/config.xml"));
//获取包含支付方式名称的文本节点
NodeList nodeList = document.getElementsByTagName("payName");
Node classNode = nodeList.item(0).getFirstChild();
String payName = classNode.getNodeValue().trim();
return payName;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
config.xml:
<?xml version="1.0"?>
<config>
<payName>creditcard</payName>
</config>
Client.java:
import Factory.PayMethodFactory;
import PayMethod.AbstractPay;
import Utils.XMLUtils;
public class Client {
public static void main(String[] args) {
try {
AbstractPay abstractPay;
String payName = XMLUtils.getPayName();
abstractPay = PayMethodFactory.getPayMethod(payName);
abstractPay.pay();
}catch (Exception e){
System.out.println(e.getMessage());
}
}
}
测试启动:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128226.html