文档章节

java设计模式-工厂模式

走世界
 走世界
发布于 2017/09/06 01:21
字数 1100
阅读 7
收藏 0
点赞 0
评论 0

    我在学习工厂模式时不理解的一点就是工厂模式中也介绍到了抽象工厂。但抽象工厂模式又属于设计模式的一种,所以我有些想不通,如下是我通过查询资料及个人理解,描述如下:

首先来看看这两者的定义区别:

  • 工厂模式:定义一个用于创建对象的借口,让子类决定实例化哪一个类
  • 抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类

再来看看工厂方法模式与抽象工厂模式对比:

工厂方法模式

抽象工厂模式

针对的是一个产品等级结构 针对的是面向多个产品等级结构
一个抽象产品类 多个抽象产品类
可以派生出多个具体产品类 每个抽象产品类可以派生出多个具体产品类

    由此个人认为这个取决于产品,如果产品单一,最合适用工厂模式,但是如果有多个产品、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品结构 ,而抽象工厂模式针对的是多个产品结构。也可以理解为抽象工厂模式是工厂方法模式的多产品升级版。工厂模式其实没多难,最难的就是什么情况使用工厂模式,如果使用的不恰当无形中增加了代码可读性、可维护性。

 

工厂模式可分为三类:

    1)简单工厂模式(Simple Factory) 
    2)工厂方法模式(Factory Method) 
    3)抽象工厂模式(Abstract Factory)

    在《java设计模式之禅》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。 

 

无工厂模式

    在没有工厂时期,如果用户想开车,一般的做法是客户去创建一款车,然后拿来用。

简单工厂模式

   客户有一个工厂来帮他生产车.想要什么车,这个工厂就可以帮他生产。  简单工厂模式又称静态工厂方法模式

代码清单:汽车总称

public interface CarService {
    public void model();
}

代码清单:汽车宝马

public class BWMServiceImpl implements CarService {
    @Override
    public void model() {
        System.out.println("我的名字叫宝马");
    }
}

代码清单:汽车福特

public class FordServiceImpl implements CarService {
    @Override
    public void model() {
        System.out.println("我的名字叫福特");
    }
}

代码清单:汽车Mini

public class MINIServiceImpl implements CarService {
    @Override
    public void model() {
        System.out.println("我的名字叫mini");
    }
}

代码清单:人类创建工厂(工厂内部结构)

public class CarFactory {
    public static <T extends CarService> T CreateCar(Class<T> c) {
        CarService car = null;
        try {
            //生产一个车
            car = (T) Class.forName(c.getName()).newInstance();
        }catch (Exception e) {
            System.out.println("汽车生产错误");
        }
        return (T) car;
    }
}

代码清单:工厂生产

    现在汽车实现类有了,工厂有了。剩下的工作就差管理给下命令让工厂开始生产

public class Mannger {
    public static void main(String[] args) {
        //生产宝马
        CarService bwmService = CarFactory.CreateCar(BWMServiceImpl.class);
        bwmService.model();
        //生产Mini
        CarService miniService = CarFactory.CreateCar(MINIServiceImpl.class);
        miniService.model();
        //生产福特
        CarService fordService = CarFactory.CreateCar(FordServiceImpl.class);
        fordService.model();
    }
}

让我们运行下,结果如下:

我的名字叫宝马
我的名字叫mini
我的名字叫福特

工厂方法模式

在简单工厂模式的基础上做两处修改变可成为工厂方法模式。

代码清单:定义抽象工厂

public abstract class CarFactoryBase {
    public abstract <T extends CarService> T CreateCar(Class<T> c);
}

代码清单:继承抽象工厂

    去掉static继承抽象工厂

public class CarFactory extends CarFactoryBase {
    @Override
    public <T extends CarService> T CreateCar(Class<T> c) {
        CarService car = null;
        try {
            car = (T) Class.forName(c.getName()).newInstance();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return (T) car;
    }
}

代码清单:工厂方法生产

public class Mannger {
    public static void main(String[] args) {
        CarFactoryBase car= new CarFactory();
        CarService bwmService = car.CreateCar(BWMServiceImpl.class);
        bwmService.model();

        CarService miniService = car.CreateCar(MINIServiceImpl.class);
        miniService.model();

        CarService fordService = car.CreateCar(FordServiceImpl.class);
        fordService.model();
    }
}

输出结果与简单工厂模式一样

我的名字叫宝马
我的名字叫mini
我的名字叫福特

抽象工厂模式

抽象工厂会在接下来的博客中编写。 

 

© 著作权归作者所有

共有 人打赏支持
走世界
粉丝 3
博文 96
码字总数 91434
作品 0
和平
程序员

暂无相关文章

OSChina 周六乱弹 —— 假如你被熊困到树上

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》 《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》- 谢...

小小编辑 ⋅ 24分钟前 ⋅ 2

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 今天 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部