栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

抽象工厂模式和工厂方法模式(简单工厂模式和抽象工厂模式的区别)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

抽象工厂模式和工厂方法模式(简单工厂模式和抽象工厂模式的区别)

文章目录

前言一、抽象工厂模式二、实现

1.步骤一2.步骤二3.步骤三 总结


前言

本人对于设计模式的学习,仅供参考!


一、抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定他们的类。每个生成的工厂都能按照工厂模式提供对象。

意图:提供一个创建一系列相关或相互依赖的对象的接口,而无需指定他们的具体类型

主要解决:主要解决接口选择问题。

何时使用:系统的产品有多于一个的产品族,而系统之消费其中某一族的产品。

如何解决:在一个产品族里面定义多个产品。

关键代码:在一个工厂类里面聚合多个同类产品。

二、实现 1.步骤一

实现产品族的抽象类和工厂的抽象类:

//食物的抽象父类
public abstract class Food {
    public abstract void printName();
}
//交通工具的抽象父类
public abstract  class Vehicle {
    public abstract void go();
}
//武器的抽象父类
public abstract class Weapon {
    public abstract void shoot();
}
//工厂的抽象父类
public abstract class AbstractFactory {
   public abstract Food createFood();
   public abstract Vehicle createVehicle();
   public abstract Weapon creatWeapon();
}
2.步骤二

实现一族产品及其工厂:
实现现代一族的产品及工厂

//现代一族的武器
public class AK47 extends Weapon {
    @Override
    public void shoot() {

    }
}
//现代一族食物
public class Bread extends Food {
    @Override
    public void printName() {
    
    }
}
//现代一族交通工具
public class Car extends Vehicle {
    @Override
    public void go() {

    }
}
//现代一族产品的工厂
public class ModernFactory extends AbstractFactory {
    @Override
    public Food createFood() {
        return new Bread();
    }
    @Override
    public Vehicle createVehicle() {
        return new Car();
    }
    @Override
    public Weapon creatWeapon() {
        return new AK47();
    }
}

实现魔法一族的产品及工厂

//魔法一组的武器
public class MagicStick extends Weapon {
    @Override
    public void shoot() {

    }
}
//魔法一组的食物
public class MushRoom extends Food {
    @Override
    public void printName() {

    }
}
//现代一族交通工具
//魔法一组的交通工具
//魔法一组的交通工具
public class Broom extends Vehicle {
    @Override
    public void go() {
    
    }
}
//现代一族产品的工厂
public class ModernFactory extends AbstractFactory {
    @Override
    public Food createFood() {
        return new Bread();
    }
    @Override
    public Vehicle createVehicle() {
        return new Car();
    }
    @Override
    public Weapon creatWeapon() {
        return new AK47();
    }
}

3.步骤三

使用工厂,获取实体类对象。

public class Main {
    public static void main(String[] args) {
        //魔法一族产品
        AbstractFactory factory=new MagicFactory();
        //切换为现代一族产品,只需要切换一个创建的工厂即可切换一族产品
        //AbstractFactory factory1=new ModernFactory();
        Food food=factory.createFood();
        food.printName();
        Vehicle vehicle=factory.createVehicle();
        vehicle.go();
        Weapon weapon=factory.creatWeapon();
        weapon.shoot();
    }
}

总结

形容词用接口,名词用抽象类。
工厂方法更便利于产品维度的扩展例如可以产品再加衣服、朋友等,抽象工厂模式更利于族维度的扩展,例如可以再加火星一族的产品(产品仍保持三个没有变)等。

更好的解决方案:Spring 的bean工厂

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/776158.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号