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条在一个页,你可以把这个功能写成工具类封装起来,然后在业务层里调用这个封装的方法,这才是业务里真正干得事,只要没访问数据库的,都要在业务里写。

   ——转自百度百科

二、遇到的问题

      没有遇到什么问题