专栏首页后台技术底层理解Java 工厂 Simple Factory&Factory&Abstract Factory

Java 工厂 Simple Factory&Factory&Abstract Factory

简单工厂

使用简单工厂的目的是创建一个对象时,不向客户暴漏内部的细节,并提供创建对象的通用接口。

  • [类]

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

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

简单工厂主要是通过提供的接口,来实现对产品生产的多态,例如提供一个水果的接口,工厂中可以根据传参的不同创建不同的水果,例如苹果,橘子,香蕉,但是最终都强转为水果来返回。

工厂

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

  • [类]

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

下图中,Factory 有一个 doSomething() 方法,这个方法需要用到一个产品对象,这个产品对象由 factoryMethod() 方法创建。该方法是抽象的,需要由子类去实现。

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 ConcreteFactory1 extends Factory {
    public Product factoryMethod() {
        return new ConcreteProduct1();
    }
}
public class ConcreteFactory2 extends Factory {
    public Product factoryMethod() {
        return new ConcreteProduct2();
    }
}

使用工厂模式主要是其对产品方法的封装的方便,产品的所有的方法都封装在工厂类中,生产不同的产品则使用对应的小工厂来实现,返回的对象强转为工厂类,这样返回的对象就可以直接使用对应的工厂方法。

工厂模式主要是继承抽象的工厂类,和一个抽象工厂方法,和所有产品要做的工厂的操作来实现的。对应的产品的生成转移到小工厂来实现。

抽象工厂

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

抽象工厂使用了组合,即 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
    }
}

抽象工厂就是工厂模式中可能生产的产品的类别变多了,工厂中会生产出两类商品

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自定义DispatcherServlet配置

    WebApplicationInitializer --> AbstractContextLoaderInitializer --> AbstractDispa...

    黑白格
  • 生成器模式builder

    生成器模式即建造者模式builder,是创建型的设计模式,主要的目的是封装一个对象的构造过程,并运行按步骤构造,我们所熟知的StringBuilder和Stri...

    黑白格
  • HeadFirst设计模式

    抽象父类只负责实现相应功能不用管具体是哪一个实现。 子类想调用哪一个行为,就new一个新的行为。

    黑白格
  • 二、设计模式总览及工厂模式详解

    不用设计模式并非不可以,但是用好设计模式能帮助我们更好地解决实际问题,设计模式最重要的是解耦。设计模式天天都在用,但自己却无感知。我们把设计模式作为一个专题,主...

    编程之心
  • Spring - 泛型依赖注入(9)

    桑鱼
  • OOAD-设计模式(三)之创建型设计模式(5种)

    前言   前面介绍了OOAD的基础知识,现在我们来详细的说明一下GOF设计模式中的23种模式,希望大家能够学到东西! 一、工厂方法模式(Factory Meth...

    用户1195962
  • [设计模式]工厂方法模式

    简介 工厂方法模式 (Factory Method)定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他子类。  工厂模式是...

    静默虚空
  • Java继承概述以及Java继承案例和继承的好处

    1.多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些相同属性和行为,只要继承那个类即可。

    黑泽君
  • JavaSE(三)之static、final、abstract修饰符

    一、static修饰符 1.1、static变量         在类中,使用static修饰的成员变量,就是静态变量,反之为非静态变量。         ...

    用户1195962
  • Spring boot常用注解收集

    无论是xml配置、java注解配置,都称为配置元数据,所谓元数据即描述数据的数据。元数据本身不具备任何可执行的能力,只能通过外界代码来对这些元数据解析后进行一些...

    用户7676729

扫码关注云+社区

领取腾讯云代金券