属于创建型设计模式,创建型模式设计对象的实例化,这类模式的特点是,不让用户依赖于对象的创建或排列方式,避免用户直接使用new运算符创建对象。
简单工厂设计模式
核心简述
使用一个工厂类,通过传入的不同参数返回不同的实例对象,通常是某一类型的不同子类。创建的实体类拥有共同的接口或父类。
使用场景
- 需要创建的对象较少,且很少会进行修改。
- 客户端不关心对象创建过程
优点
可以对创建的对象进行加工,对客户端隐藏细节
缺点
创建逻辑复杂或创建对象过多而造成代码臃肿
新增删除子类需要修改工厂类,违反了开闭原则
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| 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) { createMouse(1).click(); createMouse(2).click(); }
}
public interface Mouse {
void click();
}
public class DellMouse implements Mouse { @Override public void click() { System.out.println("Dell Click"); } }
public class HpMouse implements Mouse{ @Override public void click() { System.out.println("Hp Click"); } }
|
工厂方法设计模式
核心简述
为了符合开闭原则,不修改现有的工厂类,所以对工厂类也做了分类,不同类型的实例使用不同的实例工厂,所有实例工厂拥有共同的工厂父类或接口。
优点
对客户端隐藏对象创建细节
缺点
- 创建一个新的类型时,需要创建对应的实例类型和工厂类型,双倍的代码编写
- 只能创建同一种类型的对象,无法满足多种类型的创建。
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public interface MouseFactory {
Mouse createMouse();
}
public class DellMouseFactory implements MouseFactory { @Override public Mouse createMouse() { return new DellMouse(); } }
public class HpMouseFactory implements MouseFactory { @Override public Mouse createMouse() { return new HpMouse(); } }
public class MethodFactoryDemo {
public static void main(String[] args) { MouseFactory factory = new DellMouseFactory(); factory.createMouse().click(); }
}
|
抽象工厂设计模式
工厂方法虽然可以做到开闭原则,但是无法创建不同的对象类型,抽象工厂模式则可以解决这一个问题,可以认为抽象工厂抽象的是产品的类型,支持不同产品的创建。
个人理解抽象工厂并不是对工厂方法的扩展,而是从对象的类型角度进行了区分,抽象工厂支持不同对象类型的创建,而工厂方法仅是针对同一种对象类型做创建。
优点
可以创建不同类型的对象,新增一个工厂是不会违反开闭原则的。
缺点
新增一个产品类型,仍然需要修改各个工厂类,违反开闭原则
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| public interface ComputerFactory {
Mouse createMouse();
Keyboard createKeyboard();
}
public class DellComputerFactory implements ComputerFactory { @Override public Mouse createMouse() { return new DellMouse(); }
@Override public Keyboard createKeyboard() { return new DellKeyboard(); } }
public class HpComputerFactory implements ComputerFactory { @Override public Mouse createMouse() { return new HpMouse(); }
@Override public Keyboard createKeyboard() { return new HpKeyboard(); } }
public class AbstractFactoryDemo {
public static void main(String[] args) { ComputerFactory computerFactory = new DellComputerFactory(); computerFactory.createKeyboard().beat(); computerFactory.createMouse().click(); }
}
public interface Keyboard {
void beat();
}
public class HpKeyboard implements Keyboard { @Override public void beat() { System.out.println("惠普 键盘"); } }
public class DellKeyboard implements Keyboard { @Override public void beat() { System.out.println("戴尔 键盘"); } }
|