BGnv5 发表于 2020-12-17 19:25:12

阿里面试宝典(十二):工厂模式、控制反转、观察者模式

问题导读:
1、什么是工厂模式?
2、什么是IOC?
3、什么是观察者模式?

上一篇:阿里面试宝典(十一):面向切面编程



五、工厂模式

简单工厂
简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些。因为它至少不是Gof23种设计模式之
一。但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导,所以我想有必要
把它作为第一个讲一下。




模式动机 考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等),这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。

模式定义 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。




步骤 1
创建一个接口:

Shape.java
public interface Shape {
void draw();
}
步骤 2
创建实现接口的实体类。

Rectangle.java
public class Rectangle implements Shape {

@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
Square.java
public class Square implements Shape {

@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
Circle.java
public class Circle implements Shape {

@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}

}

步骤 3
创建一个工厂,生成基于给定信息的实体类的对象。

ShapeFactory.java
public class ShapeFactory {

//使用 getShape 方法获取形状类型的对象

public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
步骤 4
使用该工厂,通过传递类型信息来获取实体类的对象。

FactoryPatternDemo.java
public class FactoryPatternDemo {

public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();

//获取 Circle 的对象,并调用它的 draw 方法

Shape shape1 = shapeFactory.getShape("CIRCLE");

//调用 Circle 的 draw 方法

shape1.draw();

//获取 Rectangle 的对象,并调用它的 draw 方法

Shape shape2 = shapeFactory.getShape("RECTANGLE");

//调用 Rectangle 的 draw 方法

shape2.draw();

//获取 Square 的对象,并调用它的 draw 方法

Shape shape3 = shapeFactory.getShape("SQUARE");

//调用 Square 的 draw 方法

shape3.draw();
}
}

工厂方法

抽象工厂

六、控制反转IOC

在传统的应用开发过程中,当我们需要一个A对象的时候,需要我们自己去new一个A对象,并且如果这个A对象在创建过程中还依赖了B对象,我们还得自己去new这个B对象,这样就导致了newA对象的程序员还必须得知道B对象的存在,增大了类之间的耦合性,违反了依赖导致原则,不利于后续的拓展

并且在传统的应用开发过程中,我们即使使用到了接口,但还是需要自己去new接口的实现类,因此并没有做到真正的解耦,并没有做到真正的面向接口编程

IoC(Inversion of Control,控制反转

思想就是利用工厂模式,设置一个对象的容器,将对象的创建,依赖的管理,生命周期的管理都交给容器来完成,当我们需要一个对象A的时候,只需要使用类似于 A a = factory.get("A")的方式,从容器中拿A对象就可以了,至于A对象在创建过程中还需要什么对象我们完全不用去考虑

使用接口的时候,我们只需要将接口的实现类放入IOC容器中,然后从容器中拿接口的实现就可以了,可以实现真正的解耦,真正的面向接口编程。

七、观察者模式

定义:当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

/**
* 被观察者,也就是微信公众号服务
* 实现了Observerable接口,对Observerable接口的三个方法进行了具体实现

* @author jstao *
*/
public class WechatServer implements Observerable {

//注意到这个List集合的泛型参数为Observer接口,设计原则:面向接口编程而不是面向实现编程

private List<Observer> list; private String message;

public WechatServer() {
list = new ArrayList<Observer>();
}

@Override
public void registerObserver(Observer o) {

list.add(o);
}

@Override
public void removeObserver(Observer o) {
if(!list.isEmpty())
list.remove(o);
}

//遍历

@Override
public void notifyObserver() {
for(int i = 0; i < list.size(); i++) { Observer oserver = list.get(i); oserver.update(message);
}
}

public void setInfomation(String s) {
this.message = s;
System.out.println("微信服务更新消息: " + s); //消息更新,通知所有观察者
notifyObserver();
}
}





最新经典文章,欢迎关注公众号http://www.aboutyun.com/data/attachment/forum/201903/18/215536lzpn7n3u7m7u90vm.jpg

平安马 发表于 2022-1-6 13:32:28

666666

平安马 发表于 2022-1-6 16:01:27

66666666
页: [1]
查看完整版本: 阿里面试宝典(十二):工厂模式、控制反转、观察者模式