简单工厂模式
简单工厂模式其实不算23种模式之一,其实也算不上模式,可以理解为一种编程习惯。
1. 定义
将需要 实例化 对象的变化代码从不变代码中剥离出来,独立成一个对象,专门用作产生对象的对象。
2. 实例-生产不同的键盘
新建抽象键盘类
新建键盘类型枚举
public enum KeyBoardTypeEnum {
CAPACITIVE(0, ” 电容键盘 “),
MECHANICAL(1, ” 机械键盘 “);
private int code;
private String desc;
KeyBoardTypeEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
新建具体键盘类
电容键盘
public class CapacitiveKeyBoard extends BaseKeyBoard {
@ Override
public void introdution() {
System.out.println(KeyBoardTypeEnum.CAPACITIVE.getDesc());
}
}
机械键盘
public class MechanicalKeyBoard extends BaseKeyBoard {
@Override
public void introdution() {
System.out.println(KeyBoardTypeEnum.MECHANICAL.getDesc());
}
}
新建键盘工厂
public class KeyBoardFactory {
public static KeyBoardFactory newInstance() {
return new KeyBoardFactory();
}
public BaseKeyBoard createKeyBoard(KeyBoardTypeEnum type) {
switch (type) {
case CAPACITIVE:
return new CapacitiveKeyBoard();
case MECHANICAL:
return new MechanicalKeyBoard();
default:
return null;
}
}
}
测试
public class Test {
public static void main(String[] args) {
BaseKeyBoard baseKeyBoard = KeyBoardFactory.newInstance().createKeyBoard(KeyBoardTypeEnum.MECHANICAL);
baseKeyBoard.introdution();
}
}
输出:机械键盘
工厂模式
一个抽象产品类,可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。
1. 定义
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
2. 实例
如果上述实例中的工厂不止有个,不同的厂商生产他们自己的键盘。
抽象工厂
public abstract class BaseKeyBoardFactory {
abstract public BaseKeyBoard createKeyBoard(KeyBoardTypeEnum type);
}
新建具体工厂
Logitec
public class LogitecKeyBoardFactory extends BaseKeyBoardFactory {
@Override
public BaseKeyBoard createKeyBoard(KeyBoardTypeEnum type) {
switch (type) {
case CAPACITIVE:
return new LogitecCapacitiveKeyBoard();
case MECHANICAL:
return new LogitecMechanicalKeyBoard();
default:
return null;
}
}
}
Razer
public class LogitecKeyBoardFactory extends BaseKeyBoardFactory {
@Override
public BaseKeyBoard createKeyBoard(KeyBoardTypeEnum type) {
switch (type) {
case CAPACITIVE:
return new LogitecCapacitiveKeyBoard();
case MECHANICAL:
return new LogitecMechanicalKeyBoard();
default:
return null;
}
}
}
新建具体产品类(不同的工厂有他们自己的生产方式)
Logitec电容键盘
public class LogitecCapacitiveKeyBoard extends BaseKeyBoard {
@Override
public void introdution() {
System.out.println(“Logitec ” + KeyBoardTypeEnum.CAPACITIVE.getDesc());
}
}
Logitec机械键盘
public class LogitecMechanicalKeyBoard extends BaseKeyBoard {
@Override
public void introdution() {
System.out.println(“Logitec ” + KeyBoardTypeEnum.MECHANICAL.getDesc());
}
}
Razer电容键盘
public class RazerCapacitiveKeyBoard extends BaseKeyBoard {
@Override
public void introdution() {
System.out.println(“Razer ” + KeyBoardTypeEnum.CAPACITIVE.getDesc());
}
}
Razer机械键盘
public class RazerMechanicalKeyBoard extends BaseKeyBoard {
@Override
public void introdution() {
System.out.println(“Razer ” + KeyBoardTypeEnum.MECHANICAL.getDesc());
}
}
测试
public class Test {
public static void main(String[] args) {
BaseKeyBoard baseKeyBoard = new LogitecKeyBoardFactory().createKeyBoard(KeyBoardTypeEnum.CAPACITIVE);
baseKeyBoard.introdution();
baseKeyBoard = new RazerKeyBoardFactory().createKeyBoard(KeyBoardTypeEnum.CAPACITIVE);
baseKeyBoard.introdution();
}
}
输出: Logitec 电容键盘 Razer 电容键盘
抽象工厂模式
1. 定义
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
2. 设计原则
依赖倒置原则 :要依赖抽象,不要依赖具体类
3. 实例
众所周知一个工厂不可能只生产一种产品,所以我们需要增加产品。抽象工厂模式和工厂模式的区别就在与抽象工厂模式有多个抽象产品。具体工厂实现各自的生产就可以了,如下:
public abstract class BaseFactory {
abstract public BaseKeyBoard createKeyBoard(KeyBoardTypeEnum type);
abstract public BaseMouse createMouse(MouseTypeEnum type);
}
总结
工厂模式帮助我们针对抽象编程,使实例化对象在一个地方实现,很好的实现了 解耦 !
代码格式实在是调不好,大家见谅,下次我直接截图!