*概述:
- 在创建一个对象时,不向客户端暴露内部细节,并提供一个创建对象的通用接口
1. 简单工厂
- 把实例化的操作单独放到一个类中,整个类就成为简单工厂类,让简单工厂决定应该使用哪个具体子类来实例化
- 优点:客户并不需要直到子类的细节以及应当实例化哪个,而当子类发生修改时,也并不需要客户进行修改
public class SimpleFactory {
public Product createProduct(int type) {
if (type == 1) {
return new ConcreteProduct1();
} else if (type == 2) {
return new ConcreteProduct2();
}
return new ConcreteProduct();
}
}
public class Client {
public static void main(String[] args) {
SimpleFactory simpleFactory = new SimpleFactory();
Product product = simpleFactory.createProduct(1);
// do something with the product
}
}
2. 工厂方法
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法将类的实例化延迟到其之类
- 与简单工厂模式的区别:
- 简单工厂模式在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了具体产品的依赖。
- 但是需要增加新功能时,需要修改原有的类,违背了开放-封闭原则。
public abstract class Factory {
abstract public Product factoryMethod();
public void doSomething() {
Product product = factoryMethod();
// do something with the product
}
}
public class ConcreteFactory1 extends Factory {
public Product factoryMethod() {
return new ConcreteProduct1();
}
}
public class ConcreteFactory2 extends Factory {
public Product factoryMethod() {
return new ConcreteProduct2();
}
}
public class ConcreteFactory3 extends Factory {
public Product factoryMethod() {
return new ConcreteProduct3();
}
}
3. 抽象工厂
- 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
- 继承父类工厂的不同子类,分别新建不同的实例,当实例不同的子类时,就可以new不同的类了
public class AbstractProductA {
}
public class AbstractProductB {
}
public class ProductA1 extends AbstractProductA {
}
public class ProductA2 extends AbstractProductA {
}
public class ProductB1 extends AbstractProductB {
}
public class ProductB2 extends AbstractProductB {
}
public abstract class AbstractFactory {
abstract AbstractProductA createProductA();
abstract AbstractProductB createProductB();
}
public class ConcreteFactory1 extends AbstractFactory {
AbstractProductA createProductA() {
return new ProductA1();
}
AbstractProductB createProductB() {
return new ProductB1();
}
}
public class ConcreteFactory2 extends AbstractFactory {
AbstractProductA createProductA() {
return new ProductA2();
}
AbstractProductB createProductB() {
return new ProductB2();
}
}
public class Client {
public static void main(String[] args) {
AbstractFactory abstractFactory = new ConcreteFactory1();
AbstractProductA productA = abstractFactory.createProductA();
AbstractProductB productB = abstractFactory.createProductB();
// do something with productA and productB
}
}