工厂模式

工厂模式

还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用。

简单工厂模式:后来出现工业革命,用户不用去创建宝马车,因为客户有一个工厂来帮他创建宝马想要什么车,这个工厂就可以建。比如想要320i系列车。工厂就创建这个系列的车。即工厂可以创建产品。

工厂方法模式时代:为了满足客户,宝马车系列越来越多,如320i,523i等系列一个工厂无法创建所有的宝马系列,于是由单独分出来多个具体的工厂。每个具体工厂创建一种系列,即具体工厂类只能创建一个具体产品,但是宝马工厂还是个抽象,需要指定某个具体的工厂才能生产车。

抽象工厂模式时代:随着客户的要求越来越高,宝马车必须配置空调,于是这个工厂开始生产宝马车和需要的空调。 最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车。

分类

  • 简单工厂模式(Simple Factory)
  • 工厂方法模式(Factory Method)
  • 抽象工厂模式(Abstract Factory)

简单工厂

意图

在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。

简单工厂模式可视为工厂方法模式的一种特例。

类图

简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。

这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。因为客户类往往有多个,如果不使用简单工厂,所有的客户类都要知道所有子类的细节。而且一旦子类发生改变,例如增加子类,那么所有的客户类都要进行修改。

实现

public interface Product {
}

public class ConcreteProduct implements Product {
}

public class ConcreteProduct1 implements Product {
}

public class ConcreteProduct2 implements Product {
}

SimpleFactory 是简单工厂实现,它被所有需要进行实例化的客户类调用。

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
  } 
}

1)工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品。
2)抽象产品角色:它一般是具体产品继承的父类或者实现的接口。
3)具体产品角色:工厂类所创建的对象就是此角色的实例。

工厂方法

意图

定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。

类图


在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。

实现

public abstract class Factory {
    abstract public Product factoryMethod();
    public void doSomething() {
      Product product = factoryMethod();
      // do something with the product
  } 
}
public class ConcreteFactory extends Factory {
    public Product factoryMethod() {
        return new ConcreteProduct();
    }
}
public class ConcreteFactory1 extends Factory {
    public Product factoryMethod() {
        return new ConcreteProduct1();
    }
}
public class ConcreteFactory2 extends Factory {
    public Product factoryMethod() {
        return new ConcreteProduct2();
    }
}

1)抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关,是具体工厂角色必须实现的接口或者必须继承的父类。
2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。

抽象工厂

意图

提供一个接口,用于创建相关的对象家族。

类图

抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。

从高层次来看,抽象工厂使用了组合,即 Cilent 组合了 AbstractFactory,而工厂方法模式使用了继承。

实现

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
  } 
}

总结

工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。

区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

posted @ 2021-03-28 11:31  当康  阅读(65)  评论(0编辑  收藏  举报