资讯专栏INFORMATION COLUMN

Java设计模式之工厂模式详解

Rocture / 2733人阅读

摘要:工厂模式,又称为工厂方法模式。工厂模式,也就是工厂方法模式是解决了简单工厂要修改代码的问题,他把对象的创建操作延迟到子类工厂中,这样新增产品就不需要修改代码。

简单工厂其实并不是设计模式,只是一种编程习惯。

首先我们创建父类Cup,所有杯子类的父类。再创建它的子类BigCup和SmallCup类。

public abstract class Cup {
    public abstract void use();
}

public class BigCup extends Cup {
    @Override
    public void use() {
        System.out.println("大杯装500ml水");
    }
}

public class SmallCup extends Cup {
    @Override
    public void use() {
        System.out.println("小杯装100ml水");
    }
}

然后我们创建工厂类CupFactory,工厂里声明了Cup引用,根据传入的参数type来判断生产什么类型的杯子,这样外部只需要传入类型就可以生成想要的类型的对象,现在运行看一下结果,没有问题。

public class CupFactory{
    public Cup makeCup(String type){
        Cup cup = null;
        if (type.equals("big")){
            cup = new BigCup();
        }else if (type.equals("small")){
            cup = new SmallCup();
        }
        return cup;
    }
}

public static void main(String[] args){
    CupFactory cupFactory = new CupFactory();
    Cup smallCup = cupFactory.makeCup("small");
    smallCup.use();
    Cup bigCup = cupFactory.makeCup("big");
    bigCup.use();
}


结果:
小杯装100ml水
大杯装500ml水

简单工厂虽然解决了一些问题但是当我们的需要增加子类的时候就很麻烦了,需要修改工厂类里的代码,违反了开放封闭原则,所以我们现在使用真正的工厂模式来解决这个问题。

工厂模式,又称为工厂方法模式。定义了一个创建产品对象的工厂接口,将实际创建工作推迟到子类工厂当中。

首先我们创建抽象类Tableware,代表所有餐具的父类,再创建一个抽象工厂类TablewareFactory,抽象工厂里面有抽象方法makeTableware来制造餐具。然后我们创建4个餐具子类,分别是BigBowl、SmallBowl、BigCuphe和SmallCup。

public abstract class Tableware {
    public abstract void use();
}

public abstract class TableWareFactory {
    public abstract Tableware makeTableware(String type);
}

public class BigBowl extends Tableware {
    @Override
    public void use() {
        System.out.println("大碗装500g饭");
    }
}

public class SmallBowl extends Tableware {
    @Override
    public void use() {
        System.out.println("小碗装100g饭");
    }
}

public class BigCup extends Tableware {
    @Override
    public void use() {
        System.out.println("大杯装500ml水");
    }
}

public class SmallCup extends Tableware {
    @Override
    public void use() {
        System.out.println("小杯装100ml水");
    }
}

接下来我们需要实现工厂类了,这是最关键的部分,从上述4个子类可以看出,BigBowl和SmallBowl是一类产品,而BigCup和SamllCup是另一类,所以我们创建两个子类工厂,分别是BowlFactory和CupFactory。它们生产不同的产品,但是又能根据参数来生产不同规格的同类产品。在子类工厂中的makeTableware方法才是决定生产什么产品,而父类工厂并不知道,这就是将实际创建工作推迟到子类工厂当中。当我们想要新建别的产品的时候增加新的子类工厂即可。

public class BowlFactory extends TableWareFactory {

    @Override
    public Tableware makeTableware(String type) {
        Tableware tableware = null;
        if (type.equals("big")){
            tableware = new BigBowl();
        }else if (type.equals("small")){
            tableware = new SmallBowl();
        }
        return tableware;
    }
}

public class CupFactory extends TableWareFactory {
    @Override
    public Tableware makeTableware(String type) {
        Tableware tableware = null;
        if (type.equals("big")){
            tableware = new BigCup();
        }else if (type.equals("small")){
            tableware = new SmallCup();
        }
        return tableware;
    }
}

测试一下看看结果,结果没有问题。

TableWareFactory cupFactory = new CupFactory();
Tableware bigCup = cupFactory.makeTableware("big");
bigCup.use();
Tableware smallCup = cupFactory.makeTableware("small");
smallCup.use();
TableWareFactory bowlFactory = new BowlFactory();
Tableware bigBowl =  bowlFactory.makeTableware("big");
bigBowl.use();
Tableware smallBowl = bowlFactory.makeTableware("small");
smallBowl.use();

结果:
大杯装500ml水
小杯装100ml水
大碗装500g饭
小碗装100g饭

抽象工厂模式其实是在工厂方法模式的基础上加入了产品族的概念,也就是工厂里会生产多种产品,他们需要配套使用,例如衣服和裤子。

我们先创建一个抽象工厂BaseFactory类,有两个抽象方法makeTableware和getFood,分别生产餐具和食物,因为它们两个是要配合使用的。

public abstract class BaseFactory {
    public abstract Tableware makeTableware();
    public abstract  Food getFood();
}

然后我们创建餐具的抽象父类Tableware和事物的抽象父类Food,再创建它们的子类BigBowl、SmallCup、Meat和Milk类。

public abstract class Tableware {
    public abstract void use();
}

public abstract class Food {
    public abstract void name();
}

public class BigBowl extends Tableware {
    @Override
    public void use() {
        System.out.println("500ml的大碗");
    }
}

public class SmallCup extends Tableware {
    @Override
    public void use() {
        System.out.println("100ml的小杯子");
    }
}

public class Meat extends Food {
    @Override
    public void name() {
        System.out.println("肉");
    }
}

public class Milk extends Food {
    @Override
    public void name() {
        System.out.println("牛奶");
    }
}

接下来我们创建两个子类工厂MeatWithBowlFactory和MilkWithCupFactory
类,这两个类把肉和碗分到一个工厂里,牛奶和杯子分到一个工厂里,表示他们需要配套使用。这里的makeTableware和getFood方法也可以像上面工厂方法模式里一样接受参数生成不同规格的产品,现在是直接返回一个对象。

public class MeatWithBowlFactory extends BaseFactory {
    @Override
    public Tableware makeTableware() {
        return new BigBowl();
    }

    @Override
    public Food getFood() {
        return new Meat();
    }
}

public class MilkWithCupFactory extends BaseFactory{
    @Override
    public Tableware makeTableware() {
        return new SmallCup();
    }

    @Override
    public Food getFood() {
        return new Milk();
    }
}

现在测试一下结果,没有问题,同一个工厂可以生产需要配套的产品。

   BaseFactory baseFactory;
   baseFactory = new MeatWithBowlFactory();
   BigBowl bigBowl = (BigBowl) baseFactory.makeTableware();
   bigBowl.use();
   Meat meat = (Meat)baseFactory.getFood();
   meat.name();

   baseFactory = new MilkWithCupFactory();
   SmallCup smallCup = (SmallCup) baseFactory.makeTableware();
   smallCup.use();
   Milk milk = (Milk)baseFactory.getFood();
   milk.name();

结果:
500ml的大碗

100ml的小杯子
牛奶

总结:

简单工厂模式其实只是把创建对象这个常用的工厂做成工厂类方便调用,但是修改的时候需要修改工厂的代码,只是一种编程习惯,不是设计模式。

工厂模式,也就是工厂方法模式是解决了简单工厂要修改代码的问题,他把对象的创建操作延迟到子类工厂中,这样新增产品就不需要修改代码。

抽象工厂模式就是在工厂方法模式的基础上加入了产品族的概念,如果几个产品需要配套使用,就可以将他们放在同一个工厂里自行选择搭配,比如牛肉放在瓷碗里,猪肉放在铁碗里。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69069.html

相关文章

  • 一天一个设计模式JS实现——工厂模式

    摘要:参考文章深入理解三种工厂模式工厂模式,工厂方法模式,抽象工厂模式详解工厂模式是中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 参考文章:深入理解java三种工厂模式工厂模式,工厂方法模式,抽象工厂模式 详解 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的...

    Muninn 评论0 收藏0
  • Java - 收藏集 - 掘金

    摘要:强大的表单验证前端掘金支持非常强大的内置表单验证,以及。面向对象和面向过程的区别的种设计模式全解析后端掘金一设计模式的分类总体来说设计模式分为三大类创建型模式,共五种工厂方法模式抽象工厂模式单例模式建造者模式原型模式。 强大的 Angular 表单验证 - 前端 - 掘金Angular 支持非常强大的内置表单验证,maxlength、minlength、required 以及 patt...

    XiNGRZ 评论0 收藏0
  • 忘了再看设计模式-创建型

    摘要:推文经典设计模式之五大创建型模式附实例和详解工厂三兄弟之简单工厂模式一建造者模式概述手牵手一步两步三步四步望着天。一步步构建复杂对象推文设计模式二建造者模式建造者模式原型模式概述听我说中药苦,抄袭应该更苦。 单例模式 概述: 你是我唯一想要的了解。《七里香》 有且仅有一个实例,与能访问它的全局静态方法。 实现:饿汉、懒汉、双重锁、静态内部类、枚举。 难点:在考虑线程安全、序列化、反射、...

    Michael_Ding 评论0 收藏0
  • php设计模式

    摘要:我们今天也来做一个万能遥控器设计模式适配器模式将一个类的接口转换成客户希望的另外一个接口。今天要介绍的仍然是创建型设计模式的一种建造者模式。设计模式的理论知识固然重要,但 计算机程序的思维逻辑 (54) - 剖析 Collections - 设计模式 上节我们提到,类 Collections 中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了...

    Dionysus_go 评论0 收藏0

发表评论

0条评论

Rocture

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<