Java经典23种设计模式之创造型模式(一)
设计模式被称为程序猿的内功,之前零零散散的看过一大部分,但自己么有总结过。故此次在这里总结下。值得一提的是,设计模式并不是Java所特有。由于一直搞Android。这里就用Java为载体。最经典的设计模式有23种,分三个大类型: 创建型模式(5) 、结构型模式(7)、行为型模式(11),5 + 7 +11 = 23.网上一搜也都是一大把了,这里不过个人作的记录。本文记录创造型模式里的工厂方法(Factory Method)、抽象工厂(Abstract Factory)、单例模式这三种。力求透彻。
一、工厂方法
工厂方法牵涉到四个概念,为了通俗理解,先借用网上一个样例。男的带女的去肯德基吃饭,男的首先说要汉堡。详细啥汉堡让MM来说。个人认为这个样例不是非常恰当,easy让人造成误解。最简单的样例,就是有非常多个工厂。每个工厂都能生产特定的产品。为了清晰理解。还是结合Java设计模式(疯狂Java联盟版)来介绍。
1、Product 即产品,是个接口,详细干啥没说。
public interface Work {
void doWork();
}
2、ConcreteProduct。详细的产品。即实现了上面共同的work接口,可是做不同的事。做相同事情的当然就是一个类的概念了。
public class StudentWork implements Work {
public void doWork() {
System.out.println("学生*作业!");
}
}
public class TeacherWork implements Work {
public void doWork() {
System.out.println("老师审批作业!");
}
}
这里定义了两个详细的产品。学生的工作就是作业,老师的工作就是审批作业。
3、Creator,创造器。与上面的Product相应。Creator的目的就是获得Product。获得产品。
public interface IWorkFactory {
Work getWork();
}
4、ConcreteCreator。详细的创造器。
创造器获得Work。那么全部的详细的产品都满足要求。对每个产品都封装到一个工厂里。
public class StudentWorkFactory implements IWorkFactory {
public Work getWork() {
return new StudentWork();
}
}
public class TeacherWorkFactory implements IWorkFactory {
public Work getWork() {
return new TeacherWork();
}
}
測试代码例如以下:
public class Test {
public static void main(String[] args) {
IWorkFactory studentWorkFactory = new StudentWorkFactory();
studentWorkFactory.getWork().doWork();
IWorkFactory teacherWorkFactory = new TeacherWorkFactory();
teacherWorkFactory.getWork().doWork();
}
}
适用性:
1.当一个类不知道它所必须创建的对象的类的时候。
2.当一个类希望由它的子类来指定它所创建的对象的时候。
3.当想将创建对象的职责托付给多个帮助类中的某一个。而且希望将哪一个帮助子类是代理者这一信息局部化的时候。
二、抽象工厂
有了上面的样例就非常好理解抽象工厂了。
举个样例,去商店买东西,商店就是Factory,你要啥直接说。店员就给你拿啥。
结合上面的样例,定义一个WorkFactory实现IWorkFactory接口。在WorkFactory里传进去一个參数,依据參数推断是new一个StudentWork还是TeacherWork,然后return。这就是抽象工厂。
这是最简单、直白的理解。为了清晰理解。以下再附一个复杂的样例。
1、AbstractProduct 抽象产品
public interface ICat {
void eat();
}
public interface IDog {
void eat();
}
2、ConcreteProduct 详细产品
public class BlackCat implements ICat {
public void eat() {
System.out.println("The black cat is eating!");
}
}
public class WhiteCat implements ICat {
public void eat() {
Sy*tem.out.prin*ln("The w*ite cat is eating!*);
}
}
public class BlackDog implements IDog {
public void eat() {
System.out.println("The black dog is eating");
}
}
public class WhiteDog implements IDog {
public void eat() {
System.out.println("The white dog is eat*ng!");
}
}
3、AbstractFactory 抽象的工厂,接口。
public interface IAnimalFactory {
ICat createCat();
IDog createDog();
}
4、
ConcreteFactory 详细的工厂,实现上面的接口.
public class BlackAnimalFactory implements IAnimalFactory {
public ICat createCat() {
return new BlackCat();
}
public IDog createDog() {
return new BlackDog();
}
}
public class WhiteAnimalFactory imp*ements IAnimalFactory {
public ICat createCat() {
return new WhiteCat();
}
public IDog createDog() {
return new WhiteDog();
}
}
測试代码:
public static void main(String[] args) {
IAnimalFactory blackAnimalFactory = new BlackAnimalFactory();
ICat blackCat = blackAnimalFactory.createCat();
blackCat.eat();
IDog blackDog = blackAnimalFactory.createDog();
blackDog.eat();
IAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory();
ICat whiteCat = whiteAnimalFactory.createCat();
whiteCat.eat();
IDog whiteDog = whiteAnimalFactory.createDog();
whiteDog.eat();
}
注:能够看到这个复杂的样例就用interface来表述了工厂依据不同的须要创造不同的产品,而简单的样例是传參数确定不同的产品。
使用场合:
1.一个系统要独立于它的产品的创建、组合和表示时。
2.一个系统要由多个产品系列中的一个来配置时。
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时*
4当你提供一个产品类库,而只想显示它们的接口而不是实现时。
三、单例模式
这样的模式用的比較多,參见博文对此说的非常明确了,我就不重述了。
要点:
1就是为了线程调用的安全性。加上同步锁。为了效率使用双重锁定。
2、除了这样的经典的单例外还有其它单例模式。
Java经典23种设计模式之创造型模式(一)的更多相关文章
- java的23种设计模式之建造者模式
场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...
- Java经典23种设计模式之结构型模式(一)
结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...
- Java经典23种设计模式之行为型模式(二)
本文接着介绍行为型模式里的解释器模式.迭代器模式.中介者模式. 一.解释器模式Interpret 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言的中的句子. 1 ...
- Java经典23种设计模式之行为型模式(三)
本文接着介绍11种行为型模式里的备忘录模式.观察者模式.状态模式. 一.备忘录模式 在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态.这样以后就能够将该对象恢复到原先保存的状 ...
- 从追MM谈Java的23种设计模式(转)
从追MM谈Java的23种设计模式 这个是从某个文章转载过来的.但是忘了原文链接.如果知道的,我追加一下. 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西 ...
- 从追MM谈Java的23种设计模式
从追MM谈Java的23种设计模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯 德基,只管向服务员说“来四个鸡 ...
- JAVA:23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java实现23种设计模式
一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- Java基础-Java中23种设计模式之常用的设计模式
Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...
随机推荐
- WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]
原文:WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载] 我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码 ...
- 基于visual Studio2013解决C语言竞赛题之0611素数排序
题目
- ACM一些题目
Low Power 先二分答案,可以通过调整证明同一台机器选的两个芯片必然是提供能量数值相邻的两个.所以再贪心一下就可以了. 时间复杂度\(O(n \log n)\). Factors 假设\(k\) ...
- PHP - 递归函数
/** * factorial($num) 计算阶乘 * @param string $num * @return string $total */ function factorial($num) ...
- rowid结构浅析
select rowid from dual AAAAB0AABAAAAOhAAA rowid结构如下: 对象号 文件号 块号 行号 XXXXXX XXX XXXXXX X ...
- Redis bio
还是一个很小的模块. bio就是background io的意思,既然要background,就要创建线程,创建几个线程呢?有几种类型的io,就创建几个线程.同一种类型的job需要排队,所以存放各自的 ...
- 文本框、文本编辑框、按钮——axure线框图部件库介绍
1. 与文本面板组合设计表单 文本框主要是在设计页面表单的时候,用的最多,通过与文本面板的组合使用,下面我们通过文本面板和文本框设计了一个简单的注册表单 对于,文本框中的文字,只需要双击即可编辑文字 ...
- Linux下SSH Session复制
羡慕Windows下secureCRT的Session Copy功能,一直在寻找Linux下类似的软件,殊不知SSH本身就支持此功能. 特别感谢阿干同学的邮件分享. 详细方法 ? 1 2 3 4 Li ...
- Fedora 17 下安装codeblocks
Fedora 17 下安装codeblocks: 1.直接从yum源安装: sudo yum install codeblocks 2.源码安装 ...
- osgi实战学习之路:5.生命周期及利用命令、装饰者模式实现基于socket交互Bundle命令demo
生命周期中关键3个类: BundleActivator 入口点,类似main方法 BundleContext Bundle上下文对象,在执行期间,为应用程序提供操作osgi框架的方法 Bundle 代 ...