设计模式java-02.工厂模式

本文详细介绍了Java设计模式中的工厂模式,包括简单工厂模式、工厂方法模式及抽象工厂模式,并通过实例对比了它们的特点与适用场景。

工厂模式在《java设计模式》中分为三种:
1.简单工厂模式:不利于生成系列产品。
2.工厂方法模式:又称为多形性工厂。
3.抽象工厂模式:又称为工具箱,产生产品族,但不利于生产新的产品。

一.简单工厂模式
从名字来看就很简单,存在的目的就是定义一个用于创建对象的接口。
来看一个简单的例子:

产品类-BWM.java

abstract class BMW{
    public BMW(){};
}

产品类-BMW320.java

public class BMW320 extends BMW{
    public BMW320{
        System.out.println("create BMW320");
    }
}

产品类-BMW523.java

public class BMW523 extends BMW{
    public BMW523{
        System.out.println("create BMW523");
    }
}

工厂类-BMWFactory.java

public class BMWFactory{
    public static BMW createBMW(int type){
        switch(type){
            case 320:
                return new BMW320();
                break;
            case 523:
                return new BMW523();
                break;
            defualt:
                return null;
        }
    }
}

要使用的话就用BWMFactory.createBMW(type)来创建对象就可以了,这个就是简单工厂模式了。
客户要什么车就创建什么对象了。

public class Customer {  
    public static void main(String[] args) {  
        BMW bmw320 = BMWFactory.createBMW(320);  
        BMW bmw523 = BMWFactory.createBMW(523);  
    }  
}  

我们从开闭原则(对扩展开放,对修改关闭)来简单分析下简单工厂模式。当客户满足现有的型号320或者523的时候,只要通知下现有的工厂创建相应的对象就好了,从这个角度上来说是满足开闭原则的。
但是当客户不满足于现有的车型时,每新加一种车型,我们都需要在工厂类BMWFactory中createBMW方法中重新添加新的的逻辑即新的case,才能满足我们的需要。这对于工厂类BMWFactory明显是比较被动的。对于这样的工厂类我们称之为全能类或者上帝类。
我们对上述代码稍微改造下,来了解下什么是工厂方法模式。

二,工厂方法模式

产品类-BWM.java

abstract class BMW{
    public BMW(){};
}

产品类-BMW320.java

public class BMW320 extends BMW{
    public BMW320{
        System.out.println("create BMW320");
    }
}

产品类-BMW523.java

public class BMW523 extends BMW{
    public BMW523{
        System.out.println("create BMW523");
    }
}

工厂类-BWMFactory.java

interface BWMFactory{
    BMW createBWM;
}

工厂类-BMW320Factory .java

public class BMW320Factory implements BWMFactory{
    @Overide
    public BMW320 createBMW(){
        return new BMW320()
    }
}

工厂类-BMW523Factory .java

public class BMW523Factory implements BWMFactory{
    @Overide
    public BMW523createBMW(){
        return new BMW523()
    }
}

public class Customer {  
    public static void main(String[] args) {  
        BMW320Factory bmw320Factory = new BMW320Factory();
        BMW320 bmw320 = bmw320Factory.createBWM();
        BMW523Factory bmw523Factory = new BMW523Factory(); 
        BMW523 bmw523 = bmw523Factory.createBWM();
    }  
}  

这就是工厂方法模式,这似乎很完美的对对象创建进行了封装,但是当新产品大量出现的时候,会大量出现与之对应的工厂类,这不是我们所愿意看到的 。

三,抽象工厂模式
抽象工厂模式是工厂方法模式的设计版本,它用来创建一组相关或者相互依赖的对象。随着客户的需求越来越高,宝马车需要不同配置的空调和发动机等配件。于是这个工厂开始生产空调和发动机,用来组装汽车。这时候工厂有两个系列的产品:空调和发动机。
我们需要做到如果宝马320系列使用空调型号A和发动机型号A,而宝马523系列使用空调型号B和发动机型号B,那么使用抽象工厂模式,在为320系列生产相关配件时,就无需制定配件的型号,它会自动根据车型生产对应的配件型号A。


发动机类-Engine.java

public interface Engine{
}

A发动机类-EngineA.java

public class EngineA extends Engine{
    public EngineA(){
        System.out.printn("created EngineA");
    }
}

B发动机类-EngineB.java

public class EngineB extends Engine{
    public EngineB(){
        System.out.printn("created EngineB");
    }
}

空调类-Aircorn.java

public interface Aircorn{
}

A空调类-AircornA.java

public class AircornA extends Aircorn{
    public AircornA(){
        System.out.printn("created AircornA");
    }
}

B空调类-AircornB.java

public class AircornB extends Aircorn{
    public AircornB(){
        System.out.printn("created AircornB");
    }
}

抽象工厂类-AbstarctFactory.java

public interface AbstarctFactory{
    public Engine createEngine();
    public Aircorn createAircorn();
}

320工厂类-BWM320Factory.java


public class BWM320Factory implements AbstractFactory{
    @Override
    public Engine createEngine(){
        return new EngineA();
    }

    @Override
    public Engine createAircorn(){
        return new AircornA();
    }

}

523工厂类-BWM523Factory .java


public class BWM523Factory implements AbstractFactory{
    @Override
    public Engine createEngine(){
        return new EngineB();
    }

    @Override
    public Engine createAircorn(){
        return new AircornB();
    }
}

客户类-Customer.java

public class Customer {  
    public static void main(String[] args) {  
        BMW320Factory bmw320Factory = new BMW320Factory();
        bmw320Factory.createEngine();
        bmw320Factory.createAircorn();
        BMW523Factory bmw523Factory = new BMW523Factory(); 
        bmw523Factory.createEngine();
        bmw523Factory.createAircorn();
    }  
}  

无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值