当前位置: 首页 > news >正文

设计模式(一)----工厂模式

基本的业务逻辑的编写并不是难事,作为一个合格的程序员能够编写出易扩展,可维护,高内聚,低耦合的代码才是真正的能力。所以从今天开始会陆陆续续的研究一下设计模式。设计模式并不是针对编程语言,而是考察的编程的思想。


  • 设计模式中最简单的应该就是工厂模式了,在我们企业项目中工厂模式和单例模式也是应用最多的模式了。今天我们就简单的介绍一下工厂模式。都是个人总结,不喜勿喷!!!

描述

  • 工厂模式就是简化了对象的构建。正常情况下我们在Java中是通过new来构建对象,但是有的对象可能需要设置一些默认值等等的额外操作。这个时候为了简化用户的操作我们引入了工厂模式的设计思想。工厂模式就是将构建对象的过程封装在工厂类中,我们需要具体的工厂类中的对象我们就可以通过工厂来获取了。提高了使用的灵活性。

优点

  • 通过上面的描述我们能够轻松的发现工厂模式带来的好处。有了工厂模式我们构建对象不需要关注对象构建的过程,我们需要的对象只需要想工厂发出生产对象的指令就可以了。抛弃构建的复杂过程,增加代码的阅读性。

情景再现

  • 工业时代到来之前我们的生产都是人工的,换句话说就是我们需要什么,我们需要自己动手去完成。而有了工厂之后就摆脱了自己的双手。比如说你现在是一家服装厂的老板,夏天来临你需要购进一批夏季服装。相信现在的你不可能自己动手去做衣服,都是通过跟服装厂联系,告诉服装厂你需要衣服的款式,一段时间后你就获得了这些你指定的衣服。至于这些衣服是如何实现的你根本不用关心。服装厂在这里就是我们工厂模式的工厂。

分类

  • 工厂模式又细分为三种:简单工厂模式+工厂方法模式+抽象工厂模式

    • 简单工厂模式:
      简单工厂模式是我们上面的情景再现的情况,简单工厂就是说所有的细节都是依靠一个工厂统一完成,这种模式下工厂的压力特别大。

    • 工厂方法模式:
      工厂方法模式在上面情景的基础上将工厂进行了更改优化,之前工厂是一个工厂生产一年四季的衣服,现在抽象一个工厂类,在有四个工厂是该抽象工厂的具体实现类,这四个工厂具体分别负责生产春夏秋冬衣服。这样仍然是工厂模式,只不过相对简单工厂模式已经减轻了工厂的压力了。

    • 抽象工厂模式:
      抽象工厂模式在抽象方法模式的基础上有进行了强化,抽象方法中是一个具体工厂的实现类负责生产一种类型的衣服,而在抽象工厂模式下一个具体的工厂的实现类可以生产多个类别的衣服。这样更加的减轻服装厂的压力了。

代码实现

这里我们就实现简单工厂模式的代码,其他两种的模式知识在简单工厂模式的基础上进行工厂类的强化

服装抽象类(Clothes)

package zhangxinhua.JavaDesignDetails.工厂模式.features;

public abstract class Clothes
{
    //袖口的数量
    private int wristband=2;
    //领口的数量
    private int neckline=1;
    //穿衣方式
    public void hold()
    {
        System.out.println("我的穿衣方式是从领口");
    }
    public int getWristband()
    {
        return wristband;
    }
    public void setWristband(int wristband)
    {
        this.wristband = wristband;
    }
    public int getNeckline()
    {
        return neckline;
    }
    public void setNeckline(int neckline)
    {
        this.neckline = neckline;
    }


}

具体服装类一(AutumnCloth)

package zhangxinhua.JavaDesignDetails.工厂模式.special;

import zhangxinhua.JavaDesignDetails.工厂模式.features.Clothes;

public class AutumnCloth extends Clothes
{

    @Override
    public void hold()
    {
        System.out.println("我是秋装,我要倒着穿");
    }

}

具体服装类二(SpringCloth)

package zhangxinhua.JavaDesignDetails.工厂模式.special;

import zhangxinhua.JavaDesignDetails.工厂模式.features.Clothes;

public class SpringCloth extends Clothes
{

    @Override
    public void hold()
    {
        System.out.println("我是春装,我要从领口穿衣");
    }

}

具体服装类三(SummerCloth)

package zhangxinhua.JavaDesignDetails.工厂模式.special;

import zhangxinhua.JavaDesignDetails.工厂模式.features.Clothes;

public class SummerCloth extends Clothes
{

    @Override
    public void hold()
    {
        System.out.println("我是夏装,我要从怀口穿");
    }

}

工厂类(Clothfactory)

package zhangxinhua.JavaDesignDetails.工厂模式.简单工厂模式.factory;

import zhangxinhua.JavaDesignDetails.工厂模式.features.Clothes;
import zhangxinhua.JavaDesignDetails.工厂模式.special.AutumnCloth;
import zhangxinhua.JavaDesignDetails.工厂模式.special.SpringCloth;
import zhangxinhua.JavaDesignDetails.工厂模式.special.SummerCloth;

public class ClothFactory
{
    public static Clothes createClothes(String type) throws Exception
    {
        Clothes clothes=null;
        switch (type)
        {
        case "spring":
            clothes=new SpringCloth();
            break;
        case "summer":
            clothes=new SummerCloth();
            break;
        case "autumn":
            clothes=new AutumnCloth();
            break;
        default:
            throw new Exception("目前不支持你指定的类型");
        }
        return clothes;
    }
}

客户端调用(client)

package zhangxinhua.JavaDesignDetails.工厂模式.简单工厂模式.client;

import zhangxinhua.JavaDesignDetails.工厂模式.features.Clothes;
import zhangxinhua.JavaDesignDetails.工厂模式.简单工厂模式.factory.ClothFactory;

public class client
{
    public static void main(String[] args) throws Exception
    {
        System.out.println("工厂你给我一套春装");
        Clothes spring = ClothFactory.createClothes("spring");
        spring.hold();
        System.out.println("********************");
        System.out.println("工厂你给我一套秋装");
        Clothes autum = ClothFactory.createClothes("autumn");
        autum.hold();
        System.out.println("********************");
        System.out.println("工厂你给我一套夏装");
        Clothes summer = ClothFactory.createClothes("summer");
        summer.hold();
        System.out.println("********************");
    }
}

效果展示

这里写图片描述


总结

  • 设计模式的学习是潜移默化,学习设计模式不要急,成长是需要时间的,今天的努力,将来的一天终会回报。

有需要源码的,或者有不理解,欢迎扫描左侧二维码,进群交流讨论。

转载于:https://www.cnblogs.com/zhangxinhua/p/8299218.html

相关文章:

  • java 基础2
  • SQLSERVER 2008 编辑所有或者任意行
  • SpringMVC接收集合页面参数
  • JSR 303 - Bean Validation 简单介绍及用法
  • mysql5.6.36简单配置主从复制
  • 安装Discuz
  • 玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo
  • 学习笔记-RTOS任务创建
  • man syslog | col -b syslog.txt
  • python---数据类型---字典
  • 逆向及修复最新iOS版少数派客户端的闪退bug
  • 开放产品开发(OPD):OPD框架
  • Folder2Iso - Download
  • vue2.0 实现click点击当前li,动态切换class
  • angular2 简述
  • 《剑指offer》分解让复杂问题更简单
  • express如何解决request entity too large问题
  • mac修复ab及siege安装
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Web Storage相关
  • 动态规划入门(以爬楼梯为例)
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 前嗅ForeSpider采集配置界面介绍
  • 推荐一个React的管理后台框架
  • 我这样减少了26.5M Java内存!
  • 小程序测试方案初探
  • 一份游戏开发学习路线
  • 走向全栈之MongoDB的使用
  • 说说我为什么看好Spring Cloud Alibaba
  • ​configparser --- 配置文件解析器​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #100天计划# 2013年9月29日
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (C++17) std算法之执行策略 execution
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (javascript)再说document.body.scrollTop的使用问题
  • (LeetCode) T14. Longest Common Prefix
  • (poj1.3.2)1791(构造法模拟)
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • . Flume面试题
  • .Net 8.0 新的变化
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET 使用配置文件
  • .net 受管制代码
  • .net 无限分类
  • .Net语言中的StringBuilder:入门到精通
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @Transient注解
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [Android]一个简单使用Handler做Timer的例子