linkin大话设计模式--抽象工厂
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大话设计模式--抽象工厂的更多相关文章
- linkin大话设计模式--简单工厂
linkin大话设计模式--工厂方法 什么是工厂方法:将多个类对象交给工厂来生成的设计被称为简单工厂模式,个人认为主要是为了实现解耦,在代码重构的时候会很重要. 代码如下: public class ...
- 大话设计模式--抽象工厂模式 Abstract Factory -- C++实现实例
1. 抽象工厂模式: 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类. 下面是工厂方法模式: 下面是抽象工厂模式: 和工厂方法模式相比 抽象工厂模式可以有多个Product抽象, ...
- linkin大话设计模式--常用模式总结
linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...
- linkin大话设计模式--建造模式
linkin大话设计模式--建造模式 建造模式是对象的创建模式,可以讲一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 建造模式的结构: 抽象建造者 ...
- linkin大话设计模式--模板方法模式
linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...
- linkin大话设计模式--观察者模式
linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...
- linkin大话设计模式--桥接模式
linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...
- linkin大话设计模式--策略模式
linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi] 策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
随机推荐
- Excel Microsoft.Jet.OLEDB.4.0 外部数据库驱动程序中(1)的意外错误
昨天更新系统的bug,据说是微软要搞事情啊 删除以下更新就行: win7 KB4041678 KB4041681 SERVER 2008 R2 KB ...
- 【读书笔记】【深入理解ES6】#7-Set集合和Map集合
ES6新标准中将Set集合和Map集合添加到JS中. ES5中Set集合和Map集合 在ES5中,开发者们用对象属性来模拟这两种集合. var set = Object.create(null); s ...
- hibernate使用注解配置索引
添加普通索引 @Table(name="t_token", indexes={@Index(name="token_strIndex", columnList= ...
- 【转载】从头编写 asp.net core 2.0 web api 基础框架 (3)
Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratc ...
- deeplearning.ai 神经网络和深度学习 week3 浅层神经网络 听课笔记
1. 第i层网络 Z[i] = W[i]A[i-1] + B[i],A[i] = f[i](Z[i]). 其中, W[i]形状是n[i]*n[i-1],n[i]是第i层神经元的数量: A[i-1]是第 ...
- TagHelper+Layui封装组件之Radio单选框
TagHelper+Layui封装组件之Radio单选框 标签名称:cl-radio 标签属性: asp-for:绑定的字段,必须指定 asp-items:绑定单选项 类型为:IEnumerable& ...
- 【NOI2014】魔法森林
为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为 1…n1…n,边标号为1…m1…m.初始时小E同学在 11 号节点,隐 ...
- HDU1465-装错信封-递推
不容易系列之一 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- UVa 725 简单枚举+整数转换为字符串
Division Write a program that finds and displays all pairs of 5-digit numbers that between them use ...
- HDU--1213并查集
题目传送门:HDU--1213 //题意:ignatius过生日,客人来到,他想知道他需要准备多少张桌子.然而一张桌子上面只能坐上相互熟悉的人, //其中熟悉可定义成为A与B认识,B与C认识,我们就说 ...