设计模式之工厂 Factory

简介: 设计模式之工厂 Factory

任何可以产生对象的方法或者类,都可以称之为工厂

  • 灵活控制生产过程
  • 权限、修饰、日志…

工厂方法

工厂方法必备的要素:抽象产品、具体产品、抽象工厂、具体工厂

具体实现:

首先我们来定义一个抽象产品:即公用的类Animal

public  abstract class Animal {
    abstract void shout();
}

然后有具体的类来集成并实现Animal

public class Cat extends Animal{
    public void shout(){
        System.out.println("喵喵");
    }
}
public class Dog extends Animal{
    @Override
    void shout() {
        System.out.println("汪汪");
    }
}

定义抽象的工厂,注意抽象工厂的返回类一定要是抽象产品,这样才具有通用性

public abstract class AnimalFactory {
    abstract Animal getAnimal();
}

工厂利用的也是面向对象中的多态的特性

然后我们来定义具体的工厂,生产具体的产品。这里要注意工厂也是有必要做成单例的,于是我们可以如下设计:

public class DogFactory extends AnimalFactory{
    public static final DogFactory dogFactory = new DogFactory();
    @Override
    Animal getAnimal() {
        return new Dog();
    }
    private DogFactory(){}
    public static DogFactory getDogFactory(){
        return dogFactory;
    }
}

主代码:

public static void main(String[] args) {
        DogFactory dogFactory = DogFactory.getDogFactory();
        Animal animal = dogFactory.getAnimal();
        animal.shout();
    }

这样,在之后如果要创建Cat、Panda等类的时候,只需要去创建一个工厂,然后利用工厂调用即可,可以大大的减少代码的变动

抽象工厂

前面我们说了工厂方法,主要是用来创建单个的类,例如Dog、Cat

但是如果现在我们需要创建一族的对象,怎么解决呢?如果继续使用工厂方法的话,那就需要创建许多的工厂,这显然比较麻烦。于是我们可以通过扩展抽象工厂来实现.

抽象工厂的必备要素:抽象工厂、抽象类、具体工厂、具体类

首先我们定义一个抽象工厂:

public  abstract class AbstractFactory {
    abstract Food getFood();
    abstract Interest getInterest();
    abstract Water getWater();
}

定义抽象类以及具体的实现类,这里就以Food为例了

public abstract class Food {
    abstract void eat();
}
public class Bread extends Food{
    @Override
    void eat() {
        System.out.println("吃面包");
    }
}

具体工厂:

public class TomFactory extends AbstractFactory{
    private static final TomFactory TOM_FACTORY = new TomFactory();
    private TomFactory(){}
    @Override
    Food getFood() {
        return new Bread();
    }
    @Override
    Interest getInterest() {
        return new FootBall();
    }
    @Override
    Water getWater() {
        return new HotWater();
    }
    public static TomFactory getTomFactory(){
        return TOM_FACTORY;
    }
}

main方法调用

public static void main(String[] args) {
        TomFactory tomFactory = TomFactory.getTomFactory();
        Food food = tomFactory.getFood();
        Interest interest = tomFactory.getInterest();
        Water water = tomFactory.getWater();
        food.eat();
        interest.play();
        water.drink();
    }

以上就是抽象工厂。

可以看到,抽象工厂的优势在于可以定义一族的对象,换言之,抽象工厂适合生产一类的对象,多个对象,但是不适合生产单个对象,假设我们只需要生产Food这一种对象,但是如果继承了抽象工厂,那就必须要实现他的所有方法,这显然是不符合需求的

目录
相关文章
|
27天前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
29 2
|
7月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
3月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
4月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
65 1
|
4月前
|
设计模式 XML 数据格式
python之工厂设计模式
python之工厂设计模式
python之工厂设计模式
|
4月前
|
设计模式 测试技术
依赖注入与工厂设计模式的区别
【8月更文挑战第22天】
73 0
|
6月前
|
设计模式 Java 编译器
设计模式——创建型模式(工厂,简单工厂,单例,建造者,原型)
设计模式——创建型模式(工厂,简单工厂,单例,建造者,原型)
|
5月前
|
设计模式 Java 开发者
工厂设计模式的实现与应用场景分析
工厂设计模式的实现与应用场景分析
|
7月前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
|
7月前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式