工厂模式

工厂模式

什么是工厂模式

  • 工厂是生产产品的,在程序中,任何可以产生对象的方法或者类都可以称为工厂,比如单例模式。
  • 那么有了new之后,为什么还要有工厂呢,它是为了可以更加灵活地控制生产过程。

举例

以生产手机为例,如果现在要生产多款手机,简单地做法就是针对每种手机创建一个类,生产每种手机的时都需要重新new

package FactoryPattern;

class iphone{
    public void call(){
        System.out.println("拨电话");
    }
}

class HuaWei{
    public void call(){
        System.out.println("拨电话");
    }
}

class Mi{
    public void call(){
        System.out.println("拨电话");
    }
}

public class Main {
    iphone phone = new iphone();
    public static void main(String[] args) {

    }
}

每次创建对象都需要修改代码,那么有没有办法解决呢?可以设置一个手机接口,通过多态的方法创建,这样把手机类别写到配置文件就行了。

package FactoryPattern;


interface Phone{
    void call();
}

class iphone implements Phone{
    public void call(){
        System.out.println("拨电话");
    }
}

class HuaWei implements Phone{
    public void call(){
        System.out.println("拨电话");
    }
}

class Mi implements Phone{
    public void call(){
        System.out.println("拨电话");
    }
}

public class Main {

    public static void main(String[] args) {
        Phone phone = new iphone();
        phone.call();
    }
}

那么如果生产手机时每种手机经过一些不同的预处理呢,这时候生产对象的代码又会来回变,怎么解决这个问题。

简单工厂

可以通过简单工厂来解决上述这个问题,将所有类型手机的创建封装到一个工厂类中。

package FactoryPattern;
//简单工厂
public class PhoneFactory {
    public iphone createIphone(){
        //before process
        return new iphone();
    }

    public HuaWei createHuaWei(){
        return new HuaWei();
    }

    public Mi createMi(){
        return new Mi();
    }
}

那么这种方法有什么缺点呢,可以看出,如果要新添加一种类型的手机,就要重写这个类,并且创函数中的处理都是写死的。那么如何解决这个问题呢,可以采用工厂方法来解决。

工厂方法

可以把每个手机类定义为一个工厂,新添加一种类型的手机就创建一个新的工厂即可

package FactoryPattern;

class iphoneFactory {
    public Phone createIphone(){
        System.out.println("生产个Iphone");
        return new iphone();
    }
}
class HuaWeiFactory {
    public Phone createHuaWei(){
        System.out.println("生产个HuaWei");
        return new HuaWei();
    }
}
class MiFactory {
    public Phone createMi(){
        System.out.println("生产个Mi");
        return new Mi();
    }
}

抽象工厂

工厂方法在产品的维度上很好扩展,那么对于产品族呢,如果现在是创建手机,电脑,平板三件套呢,该如何做呢。一种简单的做法如下

class iphone{
    public void call(){
        System.out.println("拨电话");
    }
}

class Macbook{
    public void work(){
        System.out.println("办公");
    }
}

class Ipad{
    public void play(){
        System.out.println("玩平板");
    }
}

public class Main {
    public static void main(String[] args) {
        iphone iphone = new iphone();
        iphone.call();

        Macbook macbook = new Macbook();
        macbook.work();

        Ipad ipad = new Ipad();
        ipad.play();
    }
}

这种做法,每次创建一个一种新的产品族,比如要创建华为三件套就要重写代码。那么如何解决这个问题呢,抽象工厂就可以用来解决这个问题。主要的步骤如下:

  • 将手机,电脑和平板封装为抽象类,所有类型的手机,电脑和平板继承该抽象类
  • 创建一个抽象工厂类,类中声明创建手机,电脑和平板的抽象函数,所有的产品族继承该抽象工厂类
  • 现在创建新的产品族时,只需实现一个新的工厂类。
package AbstractPattern;

abstract class Phone{
    abstract void call();
}

abstract class Computer{
    abstract void work();
}

abstract class Pad{
    abstract void play();
}



abstract class AbstractFactory {
    abstract Phone createPhone();
    abstract Computer createComputer();
    abstract Pad createPad();
}


class iphone extends Phone{
    public void call(){
        System.out.println("拨电话");
    }
}

class Macbook extends Computer{
    public void work(){
        System.out.println("办公");
    }
}

class Ipad extends Pad{
    public void play(){
        System.out.println("玩平板");
    }
}


class AppleFactory extends AbstractFactory{
    @Override
    Phone createPhone() {
        return new iphone();
    }

    @Override
    Computer createComputer() {
        return new Macbook();
    }

    @Override
    Pad createPad() {
        return new Ipad();
    }
}
public class Main {

    public static void main(String[] args) {

        AbstractFactory appleFactory = new AppleFactory();
        Phone phone = appleFactory.createPhone();
        phone.call();
        Computer computer = appleFactory.createComputer();
        computer.work();
        Pad pad = appleFactory.createPad();
        pad.play();
    }
}
posted @ 2020-10-24 11:04  提笔书几行  阅读(138)  评论(0编辑  收藏  举报