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. for循环找出2到100的质数(素数)

    思路: 1,一个数只有1和它本身两个因数,这个数叫质数. 2.注意:缩进这里else是for循环这个上下文的. 代码: for num in range(2,100): #为大循环变量num提供2-1 ...

  2. centos6.8 docker0: iptables: No chain/target/match by that name

    现象:之前docker gitlab运行的一直好好的,突然有一天访问不了,但容器却还运行着.于是我把gitlab容器重启,发现启动不了了,报错:docker0: iptables: No chain/ ...

  3. 基于 Webpack 引入公共库的几种方式

    以 jquery 和其插件 jquery-modal 为例,记录下引入公共库的几种方式. 为了方便,首先安装 jquery 和 jquery-modal: cnpm i jquery jquery-m ...

  4. Zabbix实战-简易教程(9)--触发器函数(triggers)

    Zabbix触发器函数学习 本文主要讲述zabbix触发器函数. 1.abschange 参数:缺省 值类型:float, int, str, text, log 返回值解析: Returns abs ...

  5. OGG的孩子-有损音频编码opus

    Opus是一个有损声音编码的格式,由Xiph.Org基金会开发,之后由互联网工程任务组(IETF)进行标准化,目标用希望用单一格式包含声音和语音, 取代Speex和Vorbis,且适用于网络上低延迟的 ...

  6. 认识Java中的字符串

    Java 中 String 类的常用方法 Ⅰ String 类提供了许多用来处理字符串的方法,例如,获取字符串长度.对字符串进行截取.将字符串转换为大写或小写.字符串分割等,下面我们就来领略它的强大之 ...

  7. RabbitMQ入门HelloWorld(C#)(翻译)

    介绍 先决条件 本教程假定RabbitMQ已安装并在标准端口(5672)上的本地主机上运行.如果您使用不同的主机,端口或凭据,连接设置将需要调整. 在哪里得到帮助 如果您在阅读本教程时遇到困难,可以  ...

  8. D. Longest Subsequence

    D. Longest Subsequence time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  9. Generator函数异步应用

    转载请注明出处: Generator函数异步应用 上一篇文章详细的介绍了Generator函数的语法,这篇文章来说一下如何使用Generator函数来实现异步编程. 或许用Generator函数来实现 ...

  10. [数据预处理]-中心化 缩放 KNN(一)

    据预处理是总称,涵盖了数据分析师使用它将数据转处理成想要的数据的一系列操作.例如,对某个网站进行分析的时候,可能会去掉 html 标签,空格,缩进以及提取相关关键字.分析空间数据的时候,一般会把带单位 ...