2021/9/17
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"?>
<config>
<className>Black</className>
</config>
运行遇到错误: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条在一个页,你可以把这个功能写成工具类封装起来,然后在业务层里调用这个封装的方法,这才是业务里真正干得事,只要没访问数据库的,都要在业务里写。



浙公网安备 33010602011771号