属于创建型设计模式,创建型模式设计对象的实例化,这类模式的特点是,不让用户依赖于对象的创建或排列方式,避免用户直接使用new运算符创建对象。
简单工厂设计模式
核心简述
使用一个工厂类,通过传入的不同参数返回不同的实例对象,通常是某一类型的不同子类。创建的实体类拥有共同的接口或父类。
使用场景
- 需要创建的对象较少,且很少会进行修改。
- 客户端不关心对象创建过程
优点
可以对创建的对象进行加工,对客户端隐藏细节
缺点
-
创建逻辑复杂或创建对象过多而造成代码臃肿
-
新增删除子类需要修改工厂类,违反了开闭原则
代码示例
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");
}
}
工厂方法设计模式
核心简述
为了符合开闭原则,不修改现有的工厂类,所以对工厂类也做了分类,不同类型的实例使用不同的实例工厂,所有实例工厂拥有共同的工厂父类或接口。
优点
对客户端隐藏对象创建细节
缺点
- 创建一个新的类型时,需要创建对应的实例类型和工厂类型,双倍的代码编写
- 只能创建同一种类型的对象,无法满足多种类型的创建。
代码示例
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();
}
}
抽象工厂设计模式
工厂方法虽然可以做到开闭原则,但是无法创建不同的对象类型,抽象工厂模式则可以解决这一个问题,可以认为抽象工厂抽象的是产品的类型,支持不同产品的创建。
个人理解抽象工厂并不是对工厂方法的扩展,而是从对象的类型角度进行了区分,抽象工厂支持不同对象类型的创建,而工厂方法仅是针对同一种对象类型做创建。
优点
可以创建不同类型的对象,新增一个工厂是不会违反开闭原则的。
缺点
新增一个产品类型,仍然需要修改各个工厂类,违反开闭原则
代码示例
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("戴尔 键盘");
}
}