简单工厂模式是最简单的设计模式之一,虽然不属于二十三种设计模式,但应用也较为频繁。学习它也是学习其余建立型模式的基础java
在实际软件开发中,有时需建立一些来自于相同父类的类的实例,为此能够专门定义一个类来负责建立这些类的实例,这些被建立的实例具备共同的父类。习惯上将得到其余类实例的方法定义为static方法,外部不须要实例化这个类就能够直接调用该方法得到对象,该方法也称为静态工厂方法。设计模式
简单工厂模式又称为静态工厂方法模式,根据参数的不一样返回不一样的类型的实例。简单工厂模式专门定义一个类来负责建立其余类的实例,被建立的实例一般具备共同的父类。ide
某手机厂专为各手机品牌生产手机,调用工厂的方法时传入参数,则根据传入的不一样参数返回不一样品牌的手机。工具
抽象产品类Phone学习
public abstract class Phone { public abstract void use(); }
具体产品类HuaweiPhone测试
public class HuaweiPhone extends Phone { @Override public void use() { System.out.println("华为手机使用中...."); } }
具体产品类XiaomiPhoneui
public class XiaomiPhone extends Phone { @Override public void use() { System.out.println("小米手机使用中...."); } }
工厂类PhoneFactory设计
public class PhoneFactory { public static Phone producePhone(String brand) { if(brand.equalsIgnoreCase("huawei")) { System.out.println("生产华为手机..."); return new HuaweiPhone(); } else if (brand.equalsIgnoreCase("xiaomi")) { System.out.println("生产小米手机"); return new XiaomiPhone(); } else { System.out.println("暂无该手机生产...."); return null; } } }
配置文件code
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <!-- 经过从XML配置文件读取节点获取数据 --> <brandName>huawei</brandName> </configuration>
XML操做工具类xml
public class XMLUtilPhone { public static String getBrandName() throws Exception { //建立解析器工厂 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); //建立解析器 DocumentBuilder builder = builderFactory.newDocumentBuilder(); //获得document Document document = builder.parse("configPhone.xml"); //获取包含品牌名称的文本节点 NodeList brandNameList = document.getElementsByTagName("brandName"); Node classNode = brandNameList.item(0).getFirstChild(); String brandName = classNode.getNodeValue().trim(); return brandName; } }
测试类
public class Test { public static void main(String[] args) throws Exception { String brandName = XMLUtilPhone.getBrandName(); Phone phone = PhoneFactory.producePhone(brandName); phone.use(); } }
结果分析
若是在配置文件中将节点内容设置为huawei,则输出结果为:
若是设置为vivo,则输出结果为:
若是但愿系统支持生产vivo牌手机,则须要添加一个新的具体类VivoPhone,同时还须要修改工厂中的方法。所以简单工厂模式最大的问题在于工厂类的职责过于沉重,而且修改工厂类逻辑判断这一点是与开闭原则相违背的。