简单工厂模式是最简单的设计模式之一,虽然不属于二十三种设计模式,但应用也较为频繁。学习它也是学习其他创建型模式的基础
在实际软件开发中,有时需创建一些来自于相同父类的类的实例,为此可以专门定义一个类来负责创建这些类的实例,这些被创建的实例具有共同的父类。习惯上将获得其他类实例的方法定义为static方法,外部不需要实例化这个类就可以直接调用该方法获得对象,该方法也称为静态工厂方法。
简单工厂模式又称为静态工厂方法模式,根据参数的不同返回不同的类型的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。
某手机厂专为各手机品牌生产手机,调用工厂的方法时传入参数,则根据传入的不同参数返回不同品牌的手机。
抽象产品类Phone
public abstract class Phone {
public abstract void use();
}
具体产品类HuaweiPhone
public class HuaweiPhone extends Phone {
@Override
public void use() {
System.out.println("华为手机使用中....");
}
}
具体产品类XiaomiPhone
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;
}
}
}
配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--
通过从XML配置文件读取节点获取数据
-->
<brandName>huawei</brandName>
</configuration>
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,同时还需要修改工厂中的方法。因此简单工厂模式最大的问题在于工厂类的职责过于沉重,并且修改工厂类逻辑判断这一点是与开闭原则相违背的。
原文:https://www.cnblogs.com/Yee-Q/p/12423183.html