UML类图及工厂

目录

一、UML类图

1.什么是类图?

2.UML类图属性的表示

3.UML类图类与类之间常用关系

二、工厂

1.什么是工厂模式?

2.简单工厂(静态工厂)

3.工厂方法

3、抽象工厂


一、UML类图

1.什么是类图?

UML全称 "Unified Modeling Language",即统一建模语言,是一种可视化色面向对象建模语言,通过一系列标准的图形符号来描述系统。是用户将所希望描述的事物抽象为类,描述类的内部结构和类之间的设计视图。

2.UML类图属性的表示

属性包括:public(+)、private(-)、protected(#)、friend(~)

public class Animal {
    public String name;
    private int number;
    public void eat() {
        System.out.println("Cat eat mouse!");
    }
    public boolean run(int number) {
        System.out.println(number+"岁的猫正在走");
    }
}

接口的表示:

interface Animal {
    public void eat();
    public int run();
}

3.UML类图类与类之间常用关系

常用关系包括:泛化(Generalization)、实现(Realization)、组合(Composition)、聚合(Aggtegation)、关联(Association)、依赖(Dependency)。耦合度从强到弱:泛化=实现>组合>聚合>关联>依赖

  • 泛化

    是父类与子类的关系(继承关系,is a关系)。表示:空心三角形和实线,箭头从子类指向父类。如下图表示teacher是person子类

  • 实现

    是实现类与接口的关系。表示:空心三角形和虚线,空心三角形指向接口,如下图表示:面包类实现了食品接口

     

  • 关联

    是一种拥有关系,一个类可以调用另一个类共有的属性和方法,在类中以成员变量表示,可分为单向关联、双向关联、自关联、多重性关联

    • 单向关联

      单方面知道对方存在。表示

二、工厂

1.什么是工厂模式?

工厂模式就是将创建对象的具体过程屏蔽起来,就客户不需要知道对象是怎么创建的,只要拿来用就ok了。工厂模式可分为简单工厂模式、工厂方法模式和抽象工厂模式

2.简单工厂(静态工厂)

如果我们不用工厂模式,当客户需要一个面包时,一般情况是客户去创建一个面包,然后拿来用。而现在用了工厂模式,客户就不必创建面包了,只需要告知他想要一个面包,然后由食物工厂去创建面包。即定义一个创建对象的接口,将对象的创建和本身的业务逻辑分离。具体看下面的图及代码:

 

定义一个Food的接口,其中含materis方法

package com.gongchang.factory1;
​
public interface Food {
    public void materials();
}

由Bread和Rice实现Food接口

package com.gongchang.factory2;
​
import com.gongchang.factory1.Food;
​
public class Bread implements Food{
    public void materials() {
        System.out.println("生产面包");
    }
}
package com.gongchang.factory2;
​
import com.gongchang.factory1.Food;
​
public class Rice implements Food {
    public void materials() {
        System.out.println("生产米饭");
    }
}

定义一个FoodFactory工厂,用来判断输入是否有误

package com.gongchang.factory3;
​
import com.gongchang.factory1.Food;
import com.gongchang.factory2.Bread;
import com.gongchang.factory2.Rice;
​
public class FoodFactory {
    public Food produce(String type) {
        //返回值为Food类型
        if("面包".equals(type))
            //判断输入是否是已经存在的食物
            return new Bread();
        //不太理解哦
        else if("米饭".equals(type))
                return new Rice();
        else {
            System.out.println("请输入正确的类型");
            return null;
            //输入错误则进行提示
        }
    }
}

测试类

package com.gongchang.factory4;
​
import com.gongchang.factory1.Food;
import com.gongchang.factory3.FoodFactory;
​
public class FoodTest {
    public static void main(String[] args) {
        FoodFactory f = new FoodFactory();
        //new一个食物工厂的引用,该引用指向食物工厂
        Food food =f.produce("米饭");
//f引用的produce方法,赋给了Food类型的food引用?
        food.materials();//用food引用实现materials方法
    }
}
​

3.工厂方法

由上述代码知道,当客户要创建一个milk或其他食品时,要对类中的代码进行修改,违背了开闭原则,于是就有了工厂方法模式。

即,将工厂抽象化,并定义一个创建对象的接口。每增加新产品,只需增加该产品及相应的具体实现工厂类,有具体工厂类决定要实例化的产品是哪个,将对象的创建与实例化延迟到子类,则满足开闭原则

工厂方法模式是在简单工厂的基础上,使每一个具体的产品(如Bread)都有一个相应的工厂(BreadFactory),每一个相应的工厂都是一个实现类(也可以是一个子类),由这个相应的工厂去实例化对象,则其接口(父类或者抽象类)可以看做一个总工厂(FoodFactory),于是,客户每想要一个新的食品时,就会扩展一个相应的食品工厂类和食品类,这样就满足了开闭原则。

在简单工厂的Food、Bread、Rice基础上,具体看下面的图及代码:

 

定义一个总工厂的接口

package com.gongchang.factory3;
​
import com.gongchang.factory1.Food;
​
public interface FoodFactory {
    public Food creatfood();
    //其返回值类型是Food
}

总工厂下面的分工厂BreadFactory和RiceFactory

package com.gongchang.factory4;
​
import com.gongchang.factory1.Food;
import com.gongchang.factory2.Bread;
import com.gongchang.factory3.FoodFactory;
​
public class BreadFactory implements FoodFactory {
    public Food creatfood() {
        return new Bread();
    }
}
package com.gongchang.factory5;
​
import com.gongchang.factory1.Food;
import com.gongchang.factory4.BreadFactory;
import com.gongchang.factory4.RiceFactory;
​
public class FoodTest {
    public static void main(String[] args) {
        Food b = new BreadFactory().creatfood();
        Food r = new RiceFactory().creatfood();
        b.materials();
        r.materials();
    }
}

测试类

package com.gongchang.factory5;
​
import com.gongchang.factory1.Food;
import com.gongchang.factory4.BreadFactory;
import com.gongchang.factory4.RiceFactory;
​
public class FoodTest {
    public static void main(String[] args) {
        Food b = new BreadFactory().creatfood();
//不理解。。何种new法?对象是BreadFactory().creatfood();?
        Food r = new RiceFactory().creatfood();
        b.materials();
        r.materials();
    }
}

3、抽象工厂

实际上,一个工厂不会只生产单独的产品,而是多个,工厂方法模式生产多个产品时,代码则太过庞大。于是就用到了抽象类。先了解两个概念:

1)产品等级结构:指的是产品的继承结构,例如一个面包抽象类,它有a种面包与b种面包等一系列子类,则该抽象类与他的子类构成了一个产品等级结构

2)产品族:由同一个工厂产生的,位于不同产品等级结构中的一组产品。例如,a工厂生产a种面包、a种米饭

 

所以,抽象模式主要用于创建相关对象色家族,当一个产品族需要被设计在一起工作时,通过抽象工厂模式,能够保证客户端始终只使用一个产品族的对象

具体:

 

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值