镇江建设网站公司,网站数据分析案例,哪些经营范围是包含网站开发的,中金超钒 网站建设在开发组件的时候比如button、text等#xff0c;需要对这些组件做比较多的初始化工作#xff0c;比如初始化长度等。传统的开发方案如下#xff1a; 图 传统开发方案UML
上面的方案组件创建及组件的其他业务操作耦合在一起#xff0c;违背了单一职责原则#xff1b;在客户… 在开发组件的时候比如button、text等需要对这些组件做比较多的初始化工作比如初始化长度等。传统的开发方案如下 图 传统开发方案UML
上面的方案组件创建及组件的其他业务操作耦合在一起违背了单一职责原则在客户端Client需要知道具体的组件类名才能创建对应的组件。
1 工厂方法模式概述
定义一个用于创建对象的接口让子类决定将哪一个类实例化。针对不同的产品提供不同的工厂系统提供一个与产品等级结构对应的工厂等级。 图 工厂方法模式UML
Product: 抽象产品类是工厂模式所创建对象的超类型也是产品对象的公共父类。
ConcreteProduct: 具体的产品类由专门的具体工厂创建具体工厂和具体产品之间一一对应。
Factory: 抽象工厂类声名了创建产品的方法是工厂方法模式的核心所有创建对象的工厂类都必须实现该接口。
ConcreteFactory: 具体的工厂类实现了抽象工厂类中定义的工厂方法可有客户端调用返回一个具体产品类的实例。
1.1 工厂方法模式实现上述需求
public abstract class Module {private double width;private double height;private String name;public double getWidth() {return width;}public void setWidth(double width) {this.width width;}public double getHeight() {return height;}public void setHeight(double height) {this.height height;}public String getName() {return name;}public void setName(String name) {this.name name;}Overridepublic String toString() {return name { width width , height height };}
}public class ButtonModule extends Module{}public class TextModule extends Module{
}/*** 在开发组件的时候比如button、text等需要对这些组件做比较多的初始化工作比如初始化长度等。*/
public interface Factory {Module create();}public class ButtonFactory implements Factory{Overridepublic Module create() {ButtonModule module new ButtonModule();module.setHeight(100.0);module.setName(button);// 其他初始化工作return module;}
}public class TextFactory implements Factory{Overridepublic Module create() {TextModule textModule new TextModule();textModule.setName(text);textModule.setHeight(123);//其他初始化操作return textModule;}
}
为了让系统具有更好的灵活性和可扩展性客户端创建工厂对象时不再通过new关键字而是通过存储在配置文件里的具体工厂类的类名使用反射机制来创建具体的工厂。优化如下
?xml version1.0 encodingUTF-8?
configclassNamecom.huangmingfu.factory_method.ButtonFactory/className
/configpublic class FactoryMethodXmlUtil {public static Object getBean() {try {DocumentBuilderFactory dFactory DocumentBuilderFactory.newInstance();DocumentBuilder documentBuilder dFactory.newDocumentBuilder();Document document documentBuilder.parse(FactoryMethodXmlUtil.class.getClassLoader().getResourceAsStream(factory_method/concrete-factory.xml));NodeList nodeList document.getElementsByTagName(className);Node node nodeList.item(0).getFirstChild();String className node.getNodeValue();Class? aClass Class.forName(className);return aClass.newInstance();} catch (Exception e) {e.printStackTrace();return null;}}}public class Client {public static void main(String[] args) {Factory factory;factory (Factory) FactoryMethodXmlUtil.getBean();assert factory ! null;System.out.println(factory.getClass());Module module factory.create();System.out.println(module);}}2 优缺点
2.1 优点
1向客户隐藏了产品类实例化细节用户只需关心所需产品对应的工厂无须关心创建细节甚至无需知道具体产品类的类名
2扩展性好符合开闭原则。
2.2 缺点
1添加新的产品时需要编写新的具体产品类及对应的具体工厂类使得系统中类的个数成对增加增加了系统复杂度及开销。
3 适用场景
客户不知道所需要的对象的类只知道所对应的工厂。对象创建时需初始化操作多。