Java设计模式学习记录-简单工厂模式、工厂方法模式

前言

以前介绍了设计模式的原则和分类等概述。今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍。设计模式

简单工厂模式

 作法:建立一个工厂(方法或类)用来制造对象。iphone

当一我的想要用手机的时候,须要本身建立手机而后来使用。ide

以下:学习

public class IphoneX {

    public IphoneX(){
        System.out.println("##### 制造iphoneX #####");
    }
}
public class Iphone8 {

    public Iphone8(){
        System.out.printf("##### 制造iphone8 #####");
    }

}
public class Customer {

    /**
     * 使用手机
     */
    @Test
    public void usePhone(){
        IphoneX iphoneX = new IphoneX();
        Iphone8 iphone8 = new Iphone8();
    }

}

这种实现方式,客户在使用的手机的时候会看到手机的具体实现方式,客户就和手机的耦合度很是高,其实客户并不关心手机具体是什么实现的,为了下降耦合,就出现了工厂类,把手机的制造过程放到工厂里去实现。客户想使用手机时,将手机型号传递给工厂类里建立手机的方法就能够了。而没必要关心手机制造的整个过程,这样一来在建立手机的过程当中添加额外的一些操做也显得很灵活。这种实现方式就是下面要介绍的简单工厂模式spa

public abstract class Iphone {
    public Iphone(){

    }
}
public class IphoneX extends Iphone{

    public IphoneX(){
        System.out.println("##### 制造iphoneX #####");
    }
}
public class Iphone8 extends Iphone{

    public Iphone8(){
        System.out.printf("##### 制造iphone8 #####");
    }
}

工厂类:设计

public class FoxconnFactory {

    /**
     * 建立手机
     * @param model 型号
     * @return
     */
    public static Iphone createIphone(String model){

        switch (model){
            case "X":{
                return new IphoneX();
            }
            case "8":{
                return new Iphone8();
            }
            default:break;
        }
        return null;
    }
}

客户类:code

public class Customer {

    /**
     * 使用手机
     */
    @Test
    public void usePhone(){
        Iphone iphoneX = FoxconnFactory.createIphone("X"); 
     Iphone iphone8
= FoxconnFactory.createIphone("8");
  }
}

 简单工厂模式的类图以下:对象

这个类图上包含三个角色:blog

  • 工厂类角色(Factory):这是本模式的核心,含有必定的商业逻辑和判断逻辑。在Java中每每由一个具体类实现。
  • 抽象产品角色(Abstract Iphone Class):通常是具体产品继承的父类或者实现的接口,在Java中由一个具体类来实现。
  • 具体产品角色(IphoneX):工厂类所建立的对象就是此角色的实例,在Java中由一个具体类来实现。

在实际状况中若是咱们想使用新的型号的手机,就须要改造FoxconnFactory这个类(在类中加case)这违背了开闭原则,由于在使用新产品的时候,工厂类是属于被动改变的。为了解决这种状况,就出现了工厂方法模式,工厂方法模式与简单工厂模式的最大不一样在于,简单工厂模式只有一个(对于一个项目或一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。继承

工厂方法模式提供了多个实现相同接口的工厂类,这样每一个工厂类生产不一样类型的产品,这样若是新增长一款手机只须要新增长一个生产此款手机的工厂类就能够了,不用去改变已经存在的工厂类。这样就符合开闭原则了。

例子以下:

public abstract class Iphone {
    public Iphone(){

    }
}
public class IphoneX extends Iphone{

    public IphoneX(){
        System.out.println("##### 制造iphoneX #####");
    }
}
public class Iphone8 extends Iphone{

    public Iphone8(){
        System.out.printf("##### 制造iphone8 #####");
    }
}

工厂类:

public interface Factory {

    Iphone createIphone();

}
public class FoxconnFactory implements Factory{

    /**
     * 建立iphoneX手机
     * @return
     */
    @Override
    public Iphone createIphone(){

        return new IphoneX();
    }
}
public class HeShuoFactory implements Factory {

    /**
     * 生产iphone8手机
     * @return
     */
    @Override
    public Iphone createIphone() {

        return new Iphone8();
    }
}

客户类:

public class Customer {

    /**
     * 使用手机
     */
    @Test
    public void usePhone(){

        Factory foxconn = new FoxconnFactory();
        Factory heshuo = new HeShuoFactory();

        Iphone iphoneX = foxconn.createIphone();
        Iphone iphone8 = heshuo.createIphone();
    }

}

工厂方法模式结构图以下:

此结构图的中含四个角色:

  • 抽象工厂角色(代加工工厂):这是工厂方法模式的核心,它与应用程序无关,是具体工厂角色必须实现的接口或者必须继承的父类。在Java中他由抽象类或者接口来实现。
  • 具体工厂角色(富士康工厂):它含有与具体业务逻辑有关的代码。由应用程序调用,以建立对应的具体产品对象。在Java中它由具体类来实现。
  • 抽象产品角色(苹果手机抽象类):它是具体产品继承父类或者是实现的接口。在Java中通常有抽象类或接口来实现。
  • 具体产品角色(iphoneX手机):具体工厂角色所建立的对象就是此角色的实例。在Java中由具体的类来实现。

虽说工厂方法模式解决了简单工厂模式的不知足开闭原则的问题,可是这也形成了,代码量的成本增长,当产品数量过多时,维护起来会很麻烦,反而简单工厂没有这么麻烦,当多个产品须要修改时,简单工厂模式仍然只须要修改惟一的工厂类。不管哪一种方式都是以实现功能为目的。

对比一下得出我的结论:简单工厂模式,更简洁方便。工厂方法模式更松散,更先进。

相关文章
相关标签/搜索