简单工厂,抽象工厂,工厂方法的区别,UML类图,应用场景


一直对着几个概念辨析不清楚,今天参考了几篇文章。现在综合的总结一下。

类和类的关系以及关系的强弱

耦合度由弱到强的是

依赖(use使用),<关联(has拥有),<聚合(has),<组合(contains包含),<继承(is是),<实现(is)
依赖是弱引用(强关系),其他都是强引用,关联,聚合,组合都属于关联关系。

关联关系:

关联关系所涉及的两个类是处在同一层次上的,

聚合关系:

聚合是整体和个体之间的关系。(整体的消亡不代表个体的消亡,如汽车报废了,但轮胎可以是好的,轮胎还能接着用)
关联关系所涉及的两个类是处在同一层次上的,
而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分

组合(Composition) 关系:

组合关系是不能共享的。、代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。鸭子都有翅膀,但是A鸭子和B鸭子不能公用一双翅膀吧。

类关系的总结

java中一般使用成员变量形式实现(体现关联关系)。对象之间存在着整体与部分的关系

class Driver {   
    //使用成员变量形式实现聚合关系   
    Car mycar;   
    public void drive(){   
        mycar.run();   
    }   
}

聚合关系一般使用setter方法给成员变量赋值。
一般来说,为了表示组合关系,常常会使用构造方法来达到初始化的目的,例如上例中,加上一个以Car为参数的构造方法

public Driver(Car car){   
    mycar = car;   
}

假如给上面代码赋予如下语义:车是一辆私家车,是司机财产的一部分。则相同的代码即表示聚合关系了。聚合关系一般使用setter方法给成员变量赋值。
假如赋予如下语义:车是司机的必须有的财产,要想成为一个司机必须要先有辆车,车要是没了,司机也不想活了。而且司机要是不干司机了,这个车就砸了,别人谁也别想用。那就表示组合关系了。一般来说,为了表示组合关系,常常会使用构造方法来达到初始化的目的,例如上例中,加上一个以Car为参数的构造方法

所以,关联、聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,聚合,还是组合关系,则是无法判断的。

工厂(类)通过原料(类)生产产品(类)
工厂的生产需要原料,(原料出现在工厂类的局部变量)

类图

UML说明

– -- – -- – -- —>虚线+箭头 ==依赖

依赖:
A-------->B
A依赖B
举例

public abstract class A{
     public abstract C createC(B b);
     A(){
       B b=null;
     }
}
//A是工厂,B是材料,C是产品。
//工厂依赖于材料才能产出产品
//即B是以参数的形式出现(存在)在A类中。
//B体现为局部变量,方法的参数、或静态方法的调用,B的变化会影响到A

--------------------> 实线+箭头 ==关联

关联:
A-------------------------->B
A关联着B
举例

public class A{
     B b=new B();
     public B createB(String x){
                return new B();
       }
     public void showBinfo(){
           system.out.println(b.getName();)
     }
}
//    B b=new A().createB("得到B");
//通过A能找到或得到B。A是线索,通过这条线索(关联关系),能寻找到B
// B体现为A的全局变量,
//  A类知道(能通过方法调用)B类的公共属性和操作(B类的方法)
//    A类有B类的引用,或者说A类中有B类的实例
//A持有B的引用

-----------|<> 实线+空菱形 == 聚合

聚合:
A----------|<> B
A聚合B
举例

public class A {
   B b=null;
   A(B b){
      this.b=b;
    }
    A(){}
}
//A弱拥有 B,即b对于a来说是可有可无的,a的生死存亡不会影响到B的生死存亡
//你传递了B,则A族群里就有了一个B,你不传递B,则A族群里就没有个体,A就是没有个体的群体。就像鹅群里可以没有黑鹅(聚合),它取决于黑鹅加不加入这个鹅群,但是鹅不能没有翅膀(组合),鹅诞生的时候就同时拥有了翅膀。

----------|<<>> 实线+实菱形 == 组合

组合:
A----------|<<>> B
A组合B
举例

public class A {
   B b;
   A(){
     b=new B();
     }
}
//组合是一种强关系。A和B的生命周期一致,A生,B生,A亡,B亡
//A是人,B是手,足,A不能没有B,B也不能离开A
//在构造方法中,创建A的同时,B必然会被创建 

-----------|> 实线+三角 ==继承

继承:
A------------|> B
A继承于B
举例

public class A extends B{
        supper();
     }

---- ---- – —|> 虚线+三角 == 实现

实现:
A— ---- -----|> B
A实现B
举例

public class A implements B{}

UML总结

在这里插入图片描述
抛开三角,虚线+箭头(虚箭头),其他都是关联关系。

工厂方法

在这里插入图片描述
工厂方法模式只有一个抽象产品类
具体工厂类只能创建一个具体产品类的实例

抽象工厂

在这里插入图片描述
抽象工厂有多个抽象产品
具体工厂类可以创建多个具体产品类的实例

区别

  1. 工厂方法模式只有一个抽象产品类

总结

  1. 组合关系一般使用构造方法来达到初始化
  2. 聚合关系一般使用setter方法给成员变量赋值
  3. 关联关系一般是一个类把另一个类作为成员变量(即一个类拥有另一个类的引用)去使用它
  4. 依赖关系一般是一个类的对象作为参数被另一个类调用

参考文章

简单工厂,抽象工厂,工厂方法的区别

https://blog.csdn.net/xiao1_1bing/article/details/81774931?utm_source=app

23种设计模式类图

https://blog.csdn.net/weixin_30896825/article/details/98544290?utm_source=app

具体实现的代码

https://blog.csdn.net/xiao1_1bing/article/details/81774931?utm_source=app

类和类的关系

https://blog.csdn.net/wdjxxl/article/details/79608796

类之间的关系和关系间的区别

https://www.jianshu.com/p/4073bb2d7c6f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值