linkin大话设计模式--抽象工厂



在前面讲到的简单工厂里面虽然实现了我们那个类和其中的依赖的解耦,但是在产生我们需要的依赖的那个工厂里面还是和具体的产品类耦合了  现在要是还想彻底解耦的话怎么办呢?  就是在我们调用依赖的时候,传入一个参数,然后加入自己的判断这样子的话也就解耦了。在高一个层次就是把工厂也设计成接口和实现类,这样子的话调用一个工厂的工厂先产生一个工厂,然后再调用不同的工厂产生一个产品。貌似有点绕,忽忽,至少我现在不是很懂这样子设计的最大的益处。



代码如下:

<strong><span style="font-size:14px;">public class Computer {

    //将其中的依赖设置成属性 注意其中的类型是接口
private Output out; //默认的构造器 最好不要省略 不管用到不用到
public Computer(){ } //属性注入的构造器 一般在使用简单工厂的时候 都是将其中的依赖作为输入注入 在spring中也可以使用set方法来注入
public Computer(Output out) {
super();
this.out = out;
} public void out(){
out.outPrint();
}
public static void main(String[] args) {
OutputFactory out = OutputFactoryFactory.getOutputFactory("2");
Computer computer = new Computer(out.getOutput());
computer.out();
} } //这里将工厂也变成了接口 现在的设计就是编译时候类型全部都是接口
interface OutputFactory{
public Output getOutput(); } class OutputFactory1 implements OutputFactory{ @Override
public Output getOutput() {
//实现了接口里面方法 产生对应的工厂的产品
return new Output1();
} } class OutputFactory2 implements OutputFactory{ @Override
public Output getOutput() {
//不同的工厂生产不同的实体产品
return new Output2();
} } //接口 在上面的Computer类中调用了一个依赖的方法 其中这个类型就是下面的接口的
interface Output{
public void outPrint();
} class Output1 implements Output{ @Override
public void outPrint() {
System.out.println("output1...");
} } class Output2 implements Output{ @Override
public void outPrint() {
System.out.println("output2...");
} } class OutputFactoryFactory{
//曾经李刚老师说过说 要是没有太多的代码经验的话 设计模式纯属扯淡 其他的设计模式我可能还有体会 但是这个抽象工厂真心没有感觉 忽忽 反而有点复杂化了。。
//我个人暂时的认为 这里只不过是默认在调用一个依赖的时候不再直接new对象了 以后依赖重构的话这里的代码是不用动的 但是这样子的不停的实现接口 也没见得有多么简单
public static OutputFactory getOutputFactory(String outputFactoryType){
if("1".equalsIgnoreCase(outputFactoryType)){
return new OutputFactory1();
}else{
return new OutputFactory2();
}
}
}</span></strong>





很多时候,我们不需要纠缠简单工厂模式,抽象工厂模式这些概念,他们统称为工厂模式。

1、如果工厂直接生产被调用对象,那么就是简单工厂模式。

2、如果工厂生产了工厂对象,那么就升级成为了抽象工厂模式。























linkin大话设计模式--抽象工厂的更多相关文章

  1. linkin大话设计模式--简单工厂

    linkin大话设计模式--工厂方法 什么是工厂方法:将多个类对象交给工厂来生成的设计被称为简单工厂模式,个人认为主要是为了实现解耦,在代码重构的时候会很重要. 代码如下: public class ...

  2. 大话设计模式--抽象工厂模式 Abstract Factory -- C++实现实例

    1. 抽象工厂模式: 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类. 下面是工厂方法模式: 下面是抽象工厂模式: 和工厂方法模式相比 抽象工厂模式可以有多个Product抽象, ...

  3. linkin大话设计模式--常用模式总结

    linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...

  4. linkin大话设计模式--建造模式

    linkin大话设计模式--建造模式 建造模式是对象的创建模式,可以讲一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 建造模式的结构: 抽象建造者 ...

  5. linkin大话设计模式--模板方法模式

    linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...

  6. linkin大话设计模式--观察者模式

    linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...

  7. linkin大话设计模式--桥接模式

    linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...

  8. linkin大话设计模式--策略模式

    linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi]  策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...

  9. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

随机推荐

  1. sql server存储过程实现批量删除

    在项目中用到了存储过程来进行批量删除的操作,给大家分享一下 原理就是把id组成的字符串在数据库分割成数组放一张临时表,删除的时候与id进行对照 --删除会员信息 if OBJECT_ID('pro_D ...

  2. 如何利用git shell提交代码到github

    在很早之前我根据找到的一些资料以及自己的实践总结了一篇如何将VS2015上的代码上传到GitHub上,后来我发现有小伙伴私信我,说跟我上面写的不一样,但是那段时间也比较忙,当我发现有人私信的时候差不过 ...

  3. SharePoint2013上传列表模板(后缀stp)

    在根网站操作

  4. Nginx常用功能(5)

    一.反向代理 1.多域名跳转(location) server www.test.com location / { proxy_pass http://192.168.100.100:8080/web ...

  5. spring boot +mysql + mybatis + druid的整理(一)——单数据源

    一,使用spring boot脚手架搭建spring boot框架生成maven项目 如下图所示: 设置自定义的坐标,即左侧的Group和Artifact,右侧可以搜索添加一些依赖,搜索不到的可以在p ...

  6. vue.js之路由

    Vue.js本身只提供数据与视图绑定及组件化等功能,如果想用它来开发一个完整的SPA(单页面应用),我们就还需要使用一些Vue.js的插件.今天我学习一种叫做Vue-router的插件,用来提供路由管 ...

  7. deeplearning.ai 人工智能行业大师访谈 Geoffrey Hinton 听课笔记

    1. 怀揣着对大脑如何存储记忆的好奇,Hinton本科最开始学习生物学和物理学,然后放弃,转而学习哲学:然后觉得哲学也不靠谱,转而学习心理学:然后觉得心理学在解释大脑运作方面也不给力,转而做了一段时间 ...

  8. 浅析ASCII、Unicode和UTF-8三种常见字符编码

    什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255( ...

  9. noip级别数论?

    TAT快noip了才开始去接触数论(真心不敢学..)这里做一下整理吧(都是些定义之类的东西= =) 欧几里德:gcd(a,b)=gcd(b,a%b);具体证明见百科? 扩展欧几里德: 求a*x+b*y ...

  10. oracle存储过程的创建和使用

    创建存储过程: 格式:create or replace procedure procedure_name(参数 参数类型) Is/as 变量1 变量1的类型: begin ----------业务逻 ...