在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
实现分为三步:
抽象产品类
public interface ICalculation {
int getResult(int num1, int num2);
}
具体产品类
public class CalculationSubtract implements ICalculation {
@Override
public int getResult(int num1, int num2) {
return num1 - num2;
}
}
public class CalculationMultiply implements ICalculation {
@Override
public int getResult(int num1, int num2) {
return num1 * num2;
}
}
public class CalculationAdd implements ICalculation {
@Override
public int getResult(int num1, int num2) {
return num1 + num2;
}
}
工厂类
public class SimpleCalculationFactory {
public ICalculation createCalculation(String operation){
switch (operation){
case "+":
return new CalculationAdd();
case "-":
return new CalculationSubtract();
case "*":
return new CalculationMultiply();
default:
return null;
}
}
}
测试类
public class SimpleCalculationTest {
public static void main(String[] args) {
SimpleCalculationFactory simpleCalculationFactory = new SimpleCalculationFactory();
ICalculation calculation = simpleCalculationFactory.createCalculation("+");
int result = calculation.getResult(1, 2);
System.out.println(result);
}
}

优点
缺点
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法把实例化推迟到子类。这样的好处是再添加新的对象的时候,就不用再改代码了,代码的可扩展性强了。要做的就是:子类工厂继承或实现抽象的工厂,写一个新的创建类的工厂,然后再在客户端调用即可,不需要修改原来的代码。
实现分为四步:
这里抽象产品类以及具体产品类与简单工厂中的实现相同,这里就不再做展示。
我们直接展示抽象工厂类和具体工厂类。
抽象工厂类
public interface IFactory {
ICalculation createCalculation();
}
具体工厂类
public class AddFactory implements IFactory{
@Override
public ICalculation createCalculation() {
return new CalculationAdd();
}
}
public class MultiplyFactory implements IFactory{
@Override
public ICalculation createCalculation() {
return new CalculationMultiply();
}
}
public class SubtractFactory implements IFactory{
@Override
public ICalculation createCalculation() {
return new CalculationSubtract();
}
}
测试代码
public class FactoryMethodTest {
public static void main(String[] args) {
IFactory addFactory = new AddFactory();
ICalculation calculation = addFactory.createCalculation();
int result = calculation.getResult(1, 2);
System.out.println(result);
}
}

优点
缺点
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体定。抽象工厂允许客户使用抽象确有工厂创建一组相关的产品,而不需要(或关心)实际产出的具体产品是什么。这样一样,客户就从具体的产品中被解耦。
在前面的工厂方法模式中,考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机。工厂方法模式只考虑生产同等级(同种类被称为同等级)的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调。而抽象工厂模式就考虑了多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族,如图所示的是海尔工厂和 TCL 工厂所生产的电视机与空调对应的关系图。

这里拿Haier和TCL的电器作为例子来讲解抽象工厂模式。
抽象工厂类
public interface IFactory {
IAirCondition createAirCondition();
ITelevision createTelevision();
}
具体工厂类
public class HaierFactory implements IFactory{
@Override
public IAirCondition createAirCondition() {
return new HaierAirCondition();
}
@Override
public ITelevision createTelevision() {
return new HaierTelevision();
}
}
public class TCLFactory implements IFactory{
@Override
public IAirCondition createAirCondition() {
return new TCLAirCondition();
}
@Override
public ITelevision createTelevision() {
return new TCLTelevision();
}
}
抽象产品类
public interface ITelevision {
void show();
}
public interface IAirCondition {
void airConditioning();
}
具体产品类
public class HaierTelevision implements ITelevision{
@Override
public void show() {
System.out.println("Haier电视启动了,显示效果偏暖......");
}
}
public class HaierAirCondition implements IAirCondition{
@Override
public void airConditioning() {
System.out.println("Haier空调启动了,温度开始变化......");
}
}
public class TCLAirCondition implements IAirCondition{
@Override
public void airConditioning() {
System.out.println("TCL空调启动了,温度开始变化......");
}
}
public class TCLTelevision implements ITelevision{
@Override
public void show() {
System.out.println("TCL电视启动了,显示效果偏冷......");
}
}

优点
缺点