工厂模式初学

Posted Welljia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂模式初学相关的知识,希望对你有一定的参考价值。

工厂模式

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

工厂方法并不是让子类本身在运行时做决定,而是指在编写创建者类时,不需要知道实际创建的产口是哪一个,选择了使用哪个子类,自然就决定了实际创建的产品是什么。

所以一般使用场景,也是在明确计划在不同条件下创建不同实例时使用。而且从模式上看,只要是需要生成复杂对象的地方,都可以考虑使用工厂模式,当然对于简单的直接new一下就完事儿的对象,那就不用了,用了还增加系统复杂度。

类比现实就是,需要一部手机,不用关注怎么制作出来,直接去工厂提货就行,而没有工厂模式的话,就得考虑怎么制作,手工制作后再用。

基本结构

简单工厂模式

定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类

简单工厂不算设计模式,但又经常使用,从使用上看,其实就是把创建对象的代码给单独封装起来,这样就把需要变动的部分给分离出去了,以后要改就只改这个类。这感觉有点类似函数封装,需要时调用一下,不关心内部细节。

简单工厂基本就三部分加个实际调用的客户类:

  1. 抽象产品类

一般是具体产品继承的父类或者实现的接口

  1. 具体产品类

工厂类所创建的对象就是此角色的实例。在Java中由一个具体类实现。

  1. 工厂类

核心,含有一定的商业逻辑和判断逻辑,用来创建产品

  1. 客户类

就是实际调用的业务功能,也是测试类

产品类:


//抽象类或接口,相应产品形态
public interface Phone
    public void buy();


//具体产品
public class XIAOMI implements Phone
   @Override
    public void buy() 
        System.out.println("买了小米9!");
    


//具体产品
public class HUAWEI implements Phone
     @Override
    public void buy() 
        System.out.println("买了华为P20!");
    

工厂类:

public class SimpleFactory 
    public Phone createPhone(String type)
     if (type.equals("xiaomi"))
         return new XIAOMI();
      else if (type.equals("huawei"))
         return new HUAWEI();
     
    

客户类:

public class SimpleFactoryClientTest 
    public static void main(String[] args)
        SimpleFactory simpleFactory = new SimpleFactory();
        Phone phone = simpleFactory.createPhone("xiaomi");
        phone.buy();
    

感觉平时写的代码很多其实就写成了简单工厂模式而不自知,不过这个还不够好用,如果新增加一种产品,又得在工厂类中添加新的业务逻辑,那就麻烦多了,各种创建,加载,注册等,管理复杂度又增加了,所以就有了工厂方法模式。

工厂方法模式

定义:将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定,结构上看与简单工厂模式还是差不多的,具体如下:

产品类:


//抽象类或接口,相应产品形态
public interface Phone
    public void buy();


//具体产品
public class XIAOMI implements Phone
   @Override
    public void buy() 
        System.out.println("买了小米9!");
    


//具体产品
public class HUAWEI implements Phone
     @Override
    public void buy() 
        System.out.println("买了华为P20!");
    

工厂类:

public  interface FactoryMethod 
    //工厂方法,定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定
    Phone buyPhone();

产品对工厂接口实现:


public class buyHuawei implements FactoryMethod
     @Override
    public Phone buyPhone() 
        return new XIAOMI();
    


public class buyXiaomi implements FactoryMethod
     @Override
    public Phone buyPhone() 
        return new HUAWEI();
    

客户类:

public class TestFactoryMethod  
    public static void main(String[] args)
        buyHuawei huawei = new buyHuawei();
        huawei.buyPhone().buy();
    

综上来看,工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。

上述只适合一种类别,比如买手机,但如果还想买电脑,就不行了,这就又产生了抽象工厂模式。

抽象工厂模式

抽象工厂模式可以说是简单工厂模式的扩展,它们主要的区别在于需要创建对象的复杂程度上。

在抽象工厂模式中,抽象产品可能是一个或多个,从而构成一个或多个产品族。 在只有一个产品族的情况下,抽象工厂模
式实际上退化到工厂方法模式。

使用上结构与工厂方法模式差别也不大,只是在之前的代码基础上,增加上关于买电脑的接口和相关实现。


//抽象类或接口,相应产品形态
public interface Computer
    public void order();


//具体产品
public class Thinkpad implements Computer
   @Override
    public void order() 
        System.out.println("买了Thinkpad!");
    


//与工厂模式方法最大区别就是在这了,把买电脑接口也加进去了
public  interface AbstractFactoryMethod 
    //工厂方法,定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定
    Phone buyPhone();
    Computer orderComputer();


//然后是相应实现
public class User implements AbstractFactoryMethod 
    @Override
    public Phone buyPhone() 
        return new HUAWEI();
    
    
    @Override
    public Computer orderComputer() 
        return new Thinkpad();
    


//最后测试
public class TestAbstractFactoryMethod  
    public static void main(String[] args)
        User user = new User();
        user.buyPhone().buy();
        user.orderComputer().order();
    


综上,抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。这就是抽象工厂模式的用意。

而且这也可以看出来,抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。

以上是关于工厂模式初学的主要内容,如果未能解决你的问题,请参考以下文章

工厂模式

设计模式-简单工厂工厂方法模式抽象工厂模式详解

抽象 工厂模式

JAVA设计模式——抽象工厂模式案例实现

抽象工厂模式

抽象工厂模式