设计模式-简单工厂模式实例-01
简单工厂模式/静态工厂方法(创建型设计模式)
要点:
只关注接口,不关注对象创建细节。
创建过程与使用过程相分离。
优点:
实现了对象的创建与使用的分离;
客户端只需要知道参数即可;
通过引入配置文件提高了系统灵活性。
缺点:
工厂类职责过重;
增加了系统中类的个数,增加了系统复杂度;
系统扩展困难;
工厂角色无法形成基于继承的等级结构,不易扩展。
适用环境:
工厂类负责创建的对象较少,且客户端只知道参数。
实例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()); } } }
测试启动: