目录
一、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种米饭
所以,抽象模式主要用于创建相关对象色家族,当一个产品族需要被设计在一起工作时,通过抽象工厂模式,能够保证客户端始终只使用一个产品族的对象
具体: