[19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)
一、工厂模式(分为:简单工厂模式、工厂方法模式、抽象工厂模式)
实现了创建者和调用者的分离
核心本质:1、实例化对象,用工厂方法代替new操作;2、将选择实现类、创建对象统一管理和控制,从而将调用者跟实现类解耦。
简单工厂模式:用来生产同一等级结构中的任意产品(对于增加的新的产品,需要修改已有代码)
工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
抽象工厂模式:用来生产不同产品族中的全部产品(对于增加新的产品,无能为力。支持增加新的产品族)
【扩展】面向对象设计的基本原则(核心就是"分工")
OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。
DIP(依赖倒转原则,Dependence Inversion Principe):要针对接口编程,不要针对实现编程。
LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,避免和陌生人通信(某个类尽量与少的类反生依赖关系)。
二、各种模式详解
1、简单工厂模式(静态工厂模式)
/**
* 一个"汽车"类 接口
*/
package cn.sxt.pattern; public interface Car {
void run();
} /** "奥迪"类
*
*/
package cn.sxt.pattern; public class Audi implements Car{ public void run() {
System.out.println("奥迪在跑!");
}
} /**
* "比亚迪"类
*/
package cn.sxt.pattern; public class Byd implements Car{ public void run() {
System.out.println("比亚迪在跑!");
}
}
【没有采用工厂模式】
/***
* 没有采用工厂模式的情况下
*/
package cn.sxt.pattern; public class Test_0423_Client01 {//调用者
public static void main(String[] args) {
Car car=new Audi();
Car car2=new Byd(); car.run();
car2.run();
}
}
类图:

【采用简单工厂模式】
/***
* 简单工厂模式:用来生产同一等级结构中的任意产品(对于增加的新的产品,需要修改已有代码)
* 工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
* 抽象工厂模式:用来生产不同产品族中的全部产品(对于增加新的产品,无能为力。支持增加新的产品族)
* 采用简单工厂模式的一个工厂,如果要增加新的子类如“红旗”类,只能修改已有的代码 ("return null") 做修改,但是违反开闭原则
*
*/
package cn.sxt.pattern; public class Test_0423_Factory { public static Car createCar(String type) {
if ("奥迪".equals(type)) {
return new Audi();
}else if ("比亚迪".equals(type)) {
return new Byd();
}else {
return null;
}
} //也可以采用这种方式去创建类对象所以也称它为静态方法
/* public static Car createAudi(){
return new Audi();
} public static Car createByd() {
return new Byd();
}*/
} /***
* 采用简单工厂模式的情况下
*/
package cn.sxt.pattern; public class Test_0423_Client02 {//调用者
public static void main(String[] args) {
Car car=Test_0423_Factory.createCar("奥迪");//不用直接与Audi类打交道,而是与工厂类打交道,通过调用方法new对象
Car car2=Test_0423_Factory.createCar("比亚迪"); car.run();
car2.run();
}
}
类图:

2、工厂方法模式
【一个工厂方法接口和客户类】
/***
* 工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
*/
package cn.sxt.pattern; public interface Test_0423_Factory2 {
Car createCar();
}
/***
* 采用工厂方法模式的情况下
*/
package cn.sxt.pattern;
public class Test_0423_Client03 {//调用者
public static void main(String[] args) {
Car car=new AudiFactory().createCar();
Car car2=new BydFactory().createCar();
//如果要造奔驰,那么直接增加benz.java和benzFactory.java,这样不需要修改原有代码,符合开闭原则。但是会增加代码量 car.run();
car2.run();
}
}
【各种车型的工厂】
/**
* "奥迪"专门的工厂
*/
package cn.sxt.pattern; public class AudiFactory implements Test_0423_Factory2 { public Car createCar() {
return new Audi();
} } /**
"比亚迪"专门的工厂
*
*/
package cn.sxt.pattern; public class BydFactory implements Test_0423_Factory2 { public Car createCar() { return new Byd();
} }
类图:

3、抽象工厂模式
用来生产不同产品族的全部产品
抽象工厂模式是针对产品族的情况,在多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是个很好解决办法。
【产品族】 一个产品族:发动机、座椅、轮胎
由 高级发动机、高级座椅、高级轮胎组成一个高级产品族 ,生成一个高端汽车;
由 低级发动机、低级座椅、低级轮胎组成一个低级产品族 ,生成一个低端汽车。
【一个产品族】
/***
* "发动机"接口
*/
package cn.sxt.abstractFactory; public interface Engine {
void run();
void start();
} class LuxuryEngine implements Engine{ //"好发动机"类
public void run() {
System.out.println("转的快!");
}
public void start() {
System.out.println("启动快!");
}
} class LowEngine implements Engine{ //"差发动机"类
public void run() {
System.out.println("转的慢!");
}
public void start() {
System.out.println("启动慢!");
}
} /***
* "座椅"接口
*/
package cn.sxt.abstractFactory; public interface Seat {
void comfortable();
} class LuxurySeat implements Seat{ //"好座椅"类
public void comfortable() {
System.out.println("坐着舒服!");
}
} class LowSeat implements Seat{ //"差座椅"类
public void comfortable() {
System.out.println("坐着难受!");
}
} /***
* "轮胎"接口
*/
package cn.sxt.abstractFactory; public interface Tyre {
void friction();
} class LuxuryTyre implements Tyre{ //"好轮胎"类
public void friction() {
System.out.println("摩擦力大!");
}
} class LowTyre implements Tyre{ //"差轮胎"类
public void friction() {
System.out.println("摩擦力小!");
}
}
【工厂类】
/***
* "造汽车的工厂"接口
*/
package cn.sxt.abstractFactory; public interface Test_0423_Factory03 {
Engine createEngine();
Seat createSeat();
Tyre createTyre();
} /**
* //造"高端汽车"的工厂
*/
package cn.sxt.abstractFactory; public class LuxuryCarFactory implements Test_0423_Factory03{ public Engine createEngine() {
return new LuxuryEngine();//返回好发动机的对象
} public Seat createSeat() {
return new LuxurySeat();
} public Tyre createTyre() {
return new LuxuryTyre();
}
} /**
* //造"低端汽车"的工厂
*/
package cn.sxt.abstractFactory; public class LowCarFactory implements Test_0423_Factory03{ public Engine createEngine() {//返回差发动机的对象
return new LowEngine();
} public Seat createSeat() {
return new LowSeat();
} public Tyre createTyre() {
return new LowTyre();
}
}
【一个客户对象】
/***
* 采用抽象工厂模式的情况下
*/
package cn.sxt.abstractFactory; public class Test_0423_Client04 {//调用者
public static void main(String[] args) {
Test_0423_Factory03 factory=new LuxuryCarFactory();
Engine engine=factory.createEngine();
engine.run();
engine.start(); Test_0423_Factory03 factory2=new LowCarFactory();
Tyre tyre=factory2.createTyre();
tyre.friction(); }
}
【类图】

[19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)的更多相关文章
- [Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式
注:关乎对象的创建方式的设计模式就是“创建型设计模式”(creational design pattern) 1.1 抽象工厂模式 “抽象工厂模式”(Abstract Factory Pattern) ...
- 《JAVA与模式》之抽象工厂模式
场景问题 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择 ...
- [19/04/22-星期一] GOF23_创建型模式(单例模式)
一.概念 <Design Patterns: Elements of Reusable Object-Oriented Software>(即后述<设计模式>一书),由 Eri ...
- 对象创建型模式------Abstract Factory(抽象工厂)
1. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.2. 别名 Kit3. 动机 假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大 ...
- 【编程思想】【设计模式】【创建模式creational】抽象工厂模式abstract_factory
Python版 https://github.com/faif/python-patterns/blob/master/creational/abstract_factory.py #!/usr/bi ...
- 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录
1楼留头头大神:http://www.cnblogs.com/toutou/p/4899388.html v阅读目录 v写在前面 v简单工厂模式 v工厂方法模式 v抽象工厂模式 v博客总结 v博客 ...
- Java设计模式之-----工厂模式(简单工厂,抽象工厂)
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- 【设计模式】 模式PK:抽象工厂模式VS建造者模式
1.概述 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可.而建造者模式则是要求按 ...
- [19/04/24-星期三] GOF23_创建型模式(建造者模式、原型模式)
一.建造者模式 本质:分离了对象子组件的单独构造(由Builder负责)和装配的分离(由Director负责),从而可以构建出复杂的对象,这个模式适用于:某个对象的构建过程十分复杂 好处:由于构建和装 ...
随机推荐
- SOA(面向服务架构)——踩坑后反思:这样值得吗?
SOA(面向服务架构)——踩坑后反思:这样值得吗?
- [C#]LockBits使用笔记
昨天想基于一张图片做个手机锁屏来着,原图如下:主要是嫌白底太丑了,一开始是想画图工具直接油漆桶伺候,然而一浇上去就发现问题了,变成了这样:看来得手工处理一下把底色统一了,原图分辨率挺高的,SetPix ...
- 小菜庄园 Spring------图片的上传和下载
1.图片的上传前台三个条件 文件上传页面的3个要求: < 1.表单提交为post.mothod="post" < 2.表单的 ...
- java使用lock实现一个简单的生产者和消费者模式
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public ...
- 工厂模式的认识(GOF23)
---恢复内容开始--- 对于所有的设计模式来说,其本质是哪里变化封装哪里.寻找变化点,没有万能的模式,只有适合情况的应用 工厂模式从简单工厂开始演化 1.简单工厂的主要作用在于从源头开始封装实例化, ...
- Windows任务计划向远程服务器拷贝文件,报登录失败: 未知的用户名或错误密码
问题产生很奇怪,当你登录到系统时,执行自动化作业是正常 但到了晚上凌晨自动执行作业时,则报登录失败: 未知的用户名或错误密码 解决方案: 在拷贝脚本中加及一行,创建net use 命名,每次文件拷贝前 ...
- drupal7 为视图添加 过滤标准 内容类型
1.单击 FILTER CRITERIA 右边的“添加”按钮 2.在弹出的对话框中输入“类型”,单击搜索结果中的“内容:类型” 3.确定之后,选择需要的内容类型即可,例如添加“书评”内容类型的过滤 4 ...
- html中的行内元素和块级元素小结
一.首先我们总结下行内元素和块级元素有哪些: 行内元素: <a>标签可定义锚<abbr>表示一个缩写形式<acronym>定义只取首字母缩写<b>字体加 ...
- 微软在WPC 2015中为“伙伴们”带来了什么?
在微软 WPC 2015(微软全球合作伙伴大会)上,微软全球渠道总监 Phil Sorgen 指出,微软总营收的 92% 来自合作伙伴.这句话验证了微软与合作伙伴间日益紧密的合作关系,也点出了本次大会 ...
- ssh key生成步骤
1. 安装git,从程序目录打开 "Git Bash" ,或者直接用git shell,github自带的工具 2. 键入命令:ssh-keygen -t rsa -C " ...