简单工厂模式
定义一个工厂类,根据传入的参数的值不同返回不同的实例
- 特点:被创建的实例具有共同的父类或接口
Mouse
package com.demo.pattern.factory.entity;
public interface Mouse {
void sayHi();
}
DellMouse
package com.demo.pattern.factory.entity;
public class DellMouse implements Mouse{
@Override
public void sayHi() {
System.out.println("我是戴尔鼠标");
}
}
HpMouse
package com.demo.pattern.factory.entity;
public class HpMouse implements Mouse{
@Override
public void sayHi() {
System.out.println("我是惠普鼠标");
}
}
MouseFactory
package com.demo.pattern.factory.simple;
import com.demo.pattern.factory.entity.DellMouse;
import com.demo.pattern.factory.entity.HpMouse;
import com.demo.pattern.factory.entity.Mouse;
public class MouseFactory {
public static Mouse createMouse(int type) {
switch (type) {
case 0: return new DellMouse();
case 1: return new HpMouse();
default: return new DellMouse();
}
}
public static void main(String[] args) {
Mouse mouse = MouseFactory.createMouse(1);
mouse.sayHi();
}
}
其实大体意思就是,创建一个接口Mouse里面有sayHi,然后DellMouse、HpMouse调用接口Mouse并实现sayHi方法,最后创建MouseFactory类,利用switch的参数去实现返回不同的类。
适用场景
- 需要创建的对象较少
- 客户端不关心对象的创建过程
优缺点
- 优点:可以对创建的对象进行 “加个”,对客户端隐藏相关细节
- 缺点:因创建逻辑复杂或创建对象过多而造成代码臃肿
- 缺点:新增、删除子类均会违反开闭原则
开闭原则
一个软件实体,应该对扩展开放,对修改关闭
- 应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化
新增一个类,通过扩展,就是开闭原则
package com.demo.pattern.factory.entity;
public class LenovoMouse implements Mouse{
@Override
public void sayHi() {
System.out.println("我是联想鼠标");
}
}
但是我们就需要在代理加入一个参数。
package com.demo.pattern.factory.simple;
import com.demo.pattern.factory.entity.DellMouse;
import com.demo.pattern.factory.entity.HpMouse;
import com.demo.pattern.factory.entity.LenovoMouse;
import com.demo.pattern.factory.entity.Mouse;
public class MouseFactory {
public static Mouse createMouse(int type) {
switch (type) {
case 0: return new DellMouse();
case 1: return new HpMouse();
case 2: return new LenovoMouse();
default: return new DellMouse();
}
}
public static void main(String[] args) {
Mouse mouse = MouseFactory.createMouse(1);
mouse.sayHi();
}
}
随机应变
所有原则并非一定要严格遵守,而是需要结合业务的实际情况