2021.9.22 抽象工厂方法模式(人与肤色)
一、今日学习内容
使用抽象工厂模式,完成下述产品等级结构:
1、类图
2、源代码
2.1 Man.java
package test4; /* * 抽象产品类Man */ public interface Man { public void makeM(); }
2.2 WhiteMan.java
package test4; public class WhiteMan implements Man { public void makeM() { System.out.println("我是白种男人!"); } }
2.3 YelloeMan.java
package test4; public class YellowMan implements Man { public void makeM() { System.out.println("我是黄种男人!"); } }
2.4 BlackMan.java
package test4; public class BlackMan implements Man { @Override public void makeM() { System.out.println("我是黑种男人!"); } }
2.5 Woman.java
package test4; /* * 抽象产品类Woman */ public interface Woman { public void makeW(); }
2.6 WhiteWoman.java
package test4; public class WhiteWoman implements Woman { @Override public void makeW() { System.out.println("我是白种女人!"); } }
2.7 YellowWoman.java
package test4; public class YellowWoman implements Woman { public void makeW() { System.out.println("我是黄种女人!"); } }
2.8 BlackWoman.java
package test4; public class BlackWoman implements Woman { @Override public void makeW() { System.out.println("我是黑种女人!"); } }
2.9 Color.java
package test4; /* * 抽象工厂类 (肤色) */ public interface Color { public Man produceMan(); public Woman produceWoman(); }
2.10 White.java
package test4; /* * 具体工厂类 白色肤色 */ public class White implements Color{ @Override public Man produceMan() { return new WhiteMan(); } @Override public Woman produceWoman() { return new WhiteWoman(); } }
2.11 Yellow.java
package test4; /* * 具体工厂类 黄色肤色 */ public class Yellow implements Color{ @Override public Man produceMan() { return new YellowMan(); } @Override public Woman produceWoman() { return new YellowWoman(); } }
2.12 Black.java
package test4; /* * 具体工厂类 黑色肤色 */ public class Black implements Color{ @Override public Man produceMan() { return new BlackMan(); } @Override public Woman produceWoman() { return new BlackWoman(); } }
2.13 XMLUtil.java
package test4; /* * 读取XML文件并根据存储在XML文件中的类名获取对应的对象 */ import javax.xml.parsers.*; import org.w3c.dom.*; import java.io.File; public class XMLUtil { @SuppressWarnings("deprecation") public static Object getBean() { try { //创建DOM文档对象 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("config.xml")); //获取包含类名的文本节点 NodeList nl = doc.getElementsByTagName("className"); Node classNode = nl.item(0).getFirstChild(); String cName = classNode.getNodeValue(); System.out.println("类名: "+ cName); //输出类名 //通过类名生成实例对象返回 Class c = Class.forName(cName); Object obj = c.newInstance(); return obj; } catch (Exception e) { e.printStackTrace(); return null; } } } 2.14 Client.java
2.14 Client.java
package test4; /* * 客户端测试类 */ public class Client { public static void main(String[] args) { try { Color color; Man man; Woman woman; color=(Color)XMLUtil.getBean(); System.out.println(color); woman=color.produceWoman(); woman.makeW(); man=color.produceMan(); man.makeM(); }catch(Exception e){ System.out.print(e.getMessage()); } } }
2.15 config.xml
<?xml version="1.0" encoding="UTF-8"?>Black
运行遇到错误:ClassNotFoundException
最终找到解决办法:修改XMLUtil . java,在两处加上具体路径,问题解决。
关于Dao层与service 的区别:
dao层:dao层叫数据访问层,全称为data access object,属于一种比较底bai层,比较基础的操作,具体到对于某个表、某个实体的增删改查
service层:service层叫服务层,被称为服务,肯定是相比之下比较高层次的一层结构,相当于将几种操作封装起来。
2.为什么service层要使用接口来定义有以下几点好处:
在java中接口是多继承的,而类是单继承的,如果你需要一个类实现多个service,你用接口可以实现,用类定义service就没那么灵活要提供不同的数据库的服务时,我们只需要面对接口用不同的类实现即可,而不用重复地定义类编程规范问题,接口化的编程为的就是将实现封装起来,然调用者只关心接口不关心实现,也就是“高内聚,低耦合”的思想。
首先解释面上意思,service是业务层,dao是数据访问层。
呵呵,这个问题我曾经也有过,记得以前刚学编程的时候,都是bai在service里直接调用dao,service里面就new一个dao类对象,调用,其他有意义的事没做,也不明白有这个有什么用,参加工作久了以后就会知道,业务才是工作中的重中之重。
我们都知道,标准主流现在的编程方式都是采用MVC综合设计模式,MVC本身不属于设计模式的一种,它描述的是一种结构,最终目的达到解耦,解耦说的意思是你更改某一层代码,不会影响我其他层代码,如果你会像spring这样的框架,你会了解面向接口编程,表示层调用控制层,控制层调用业务层,业务层调用数据访问层。初期也许都是new对象去调用下一层,比如你在业务层new一个DAO类的对象,调用DAO类方法访问数据库,这样写是不对的,因为在业务层中是不应该含有具体对象,最多只能有引用,如果有具体对象存在,就耦合了。当那个对象不存在,我还要修改业务的代码,这不符合逻辑。好比主板上内存坏了,我换内存,没必要连主板一起换。我不用知道内存是哪家生产,不用知道多大容量,只要是内存都可以插上这个接口使用。这就是MVC的意义。
接下来说你感觉service的意义,其实因为你现在做东西分层次不是那么严格,在一个你们做东西业务本身也少,举个最简单的例子,你做一个分页的功能,数据1000条,你20条在一个页,你可以把这个功能写成工具类封装起来,然后在业务层里调用这个封装的方法,这才是业务里真正干得事,只要没访问数据库的,都要在业务里写。
——转自百度百科
二、遇到的问题
没有遇到什么问题