java设计模式案例详解:工厂模式
1.简单工厂模式
在不考虑扩展的情况下还是很好用的,其实我们写代码也很经常用到,其主要理解在于传入不同参数则构建不同对象,只有一个工厂,如需添加产品涉及到扩展需要修改比较多的东西,不符合开闭原则,如下例子所示,传入A则获得ABook,传入B则获得BBook:
package main.java.com.learn.factory.factory;
public interface Book {
void getKnowledge();
}
package main.java.com.learn.factory.factory;
public class ABook implements Book{
@Override
public void getKnowledge() {
System.out.println("获得A知识");
}
}
package main.java.com.learn.factory.factory;
public class BBook implements Book{
@Override
public void getKnowledge() {
System.out.println("获得B知识");
}
}
package main.java.com.learn.factory.factory;
public class SimpleBookFactory {
public static Book create(String type) {
if ("A" == type)
return new ABook();
else
return new BBook();
}
}
package main.java.com.learn.factory.factory; /**
* Created by garfield on 2016/6/13.
*/
public class SimpleBookFactoryTest { public static void main(String[] args){
Book a = SimpleBookFactory.create("A");
Book b = SimpleBookFactory.create("B");
a.getKnowledge();
b.getKnowledge();
}
}
输出结果:
获得A知识
获得B知识
2.工厂模式
工厂模式其实就是在简单工厂的基础上将创建对象的逻辑挪到客户端,如此一来便于扩展类的种类,但是麻烦了客户端的编辑,下面例子其实就是在原有Book类的基础上将逻辑封装成工厂:
三个基础Book类不变;
package main.java.com.learn.factory.factory.abstractFactory; /**
* Created by garfield on 2016/6/13.
*/
public abstract class Creator {
abstract Book create();
}
package main.java.com.learn.factory.factory.abstractFactory; /**
* Created by garfield on 2016/6/13.
*/
public class ACreatorFactory extends Creator {
@Override
Book create() {
return new ABook();
}
}
package main.java.com.learn.factory.factory.abstractFactory; /**
* Created by garfield on 2016/6/13.
*/
public class BCreatorFactory extends Creator {
@Override
Book create() {
return new BBook();
}
}
package main.java.com.learn.factory.factory.abstractFactory; /**
* Created by garfield on 2016/6/13.
*/
public class FactoryTest { public static void main(String[] args){
Creator creator = new ACreatorFactory();
Creator creator2 = new BCreatorFactory();
Book a = creator.create();
Book b = creator2.create();
a.getKnowledge();
b.getKnowledge(); }
}
输出结果:
获得A知识
获得B知识
3.抽象工厂模式
虽然工厂模式使得逻辑更加清晰,扩展变得独立,但是如果需要增加类的种类,需要增加的工厂数量也同步增长,这也为扩展带来了不小负担,这也是抽象工厂与之的差别;
三个基础类依然不变,但是工厂不再是单一产品的工厂,工厂可以创建产品簇:
package main.java.com.learn.factory.factory.abstractFactory; /**
* Created by garfield on 2016/6/13.
*/
public abstract class Creator {
abstract ABook createA();
abstract BBook createB(); }
package main.java.com.learn.factory.factory.abstractFactory; /**
* Created by garfield on 2016/6/13.
*/
public class Factory extends Creator {
@Override
ABook createA() {
return new ABook();
} @Override
BBook createB() {
return new BBook();
}
}
package main.java.com.learn.factory.factory.abstractFactory; /**
* Created by garfield on 2016/6/13.
*/
public class AbstractFactoryTest {
public static void main(String[] args){
Creator creator = new Factory();
ABook a = creator.createA();
BBook b = creator.createB();
a.getKnowledge();
b.getKnowledge();
}
}
测试结果:
获得A知识
获得B知识
java设计模式案例详解:工厂模式的更多相关文章
- java设计模式案例详解:代理模式
代理模式就是用一个第三者的身份去完成工作,其实际意义跟字面意思其实是一样的,理解方式有很多,还是例子直观. 本例的实现类是实现买票功能,实际应用想要添加身份验证功能,利用代理模式添加验证步骤.上例子: ...
- java设计模式案例详解:观察者模式
观察者模式的应用场景: 1. 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变. 2. 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节. 举个例子说明,这个例子讲 ...
- Java设计模式(1)工厂模式(Factory模式)
工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...
- java设计模式-----1、简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...
- java反射案例详解
白首为功名.旧山松竹老,阻归程.欲将心事付瑶琴.知音少,弦断有谁听? [案例1]通过一个对象获得完整的包名和类名 package Reflect; /** * 通过一个对象获得完整的包名和类名 * * ...
- 重学 Java 设计模式:实战抽象工厂模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
- 我以订披萨为例,给女朋友详细讲了Java设计模式的3种工厂模式
摘要:工厂模式是将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦.从而提高项目的扩展和维护性. 本文分享自华为云社区<[Java设计模式]用 披萨订购案例 详 ...
- Java设计模式2:简单工厂模式
简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...
- JAVA设计模式(二)工厂模式
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
随机推荐
- iOS开发之即时通讯之Socket(AsyncSocket)
1.AsyncSocket介绍 如果需要在项目中像QQ微信一样做到即时通讯,必须使用socket通讯. iOS中Socket编程的方式: BSD Socket: BSD Socket 是UNIX系统中 ...
- C socket指南
1.介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措? ...
- bzoj1336: [Balkan2002]Alien最小圆覆盖
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1336 1336: [Balkan2002]Alien最小圆覆盖 Time Limit: 1 ...
- poj_1743_Musical Theme(后缀数组)
题目链接:poj_1743_Musical Theme 题意: 给你一串数字,让你找最长的变化相同不重叠的子串,至少长度为5 题解: 处理数据后用后缀数组加二分答案,然后用height数组check答 ...
- Unity5系列资源管理AssetBundle——更新实现
前面我们研究了AssetBundle的打包与加载,现在我们来了解下如何在项目中根据版本号更新内容. 最最重要的一点,细心的朋友应该看到了在加载AssetBundle的MrcAssetManager类中 ...
- Django中templates使用的补充
Django中的模版的使用 1.实例:查询用户信息,在页面显示,并隔行有底色 test1/views文件 def userinfo(request): if request.method=='GET' ...
- Openjudge-计算概论(A)-过滤多余的空格
描述: 一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格. 输入一行,一个字符串(长度不超过200),句子的头和尾都没有空格.输出过滤之后的句子. 样例输入 Hello world.Th ...
- Python 邮件发送
python发送各类邮件的主要方法 python中email模块使得处理邮件变得比较简单,今天着重学习了一下发送邮件的具体做法,这里写写自己的的心得,也请高手给些指点. 一.相关模块介绍 ...
- AccessToMySql数据库的导入以及java生成.exe文件
一.AccessToMySql 最近做了一个Access数据库导入MySql的小工具,期间遇到诸多问题,这里小计一下. 表名为cur_rec,共有5个字段 比较奇葩的是这个表居然是四个字段的联合主键, ...
- HYSBZ 1053 反质数
input n 1<=n<=2000000000 output 不大于n的最大反质数 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g( ...