【GOF23设计模式】工厂模式
来源:http://www.bjsxt.com/
一、【GOF23设计模式】_简单工厂模式详解、面向对象设计原则、开闭原则、依赖反转原则、迪米特法则
没有工厂模式的情况
package com.test.factory.simple; public interface Car {
public void run();
} package com.test.factory.simple; public class Audi implements Car{
@Override
public void run() {
System.out.println("奥迪在跑");
}
} package com.test.factory.simple; public class Byd implements Car{
@Override
public void run() {
System.out.println("比亚迪在跑");
}
}
package com.test.factory.simple;
/**
* 测试没有工厂模式的情况下
*/
public class Client01 { //调用者 依赖Audi、Byd
public static void main(String[] args) {
Car c1 = new Audi();
Car c2 = new Byd(); c1.run();
c2.run();
}
}
简单工厂模式的情况
package com.test.factory.simple; public class CarFactory {
public static Car createCar(String type){
if("奥迪".equals(type)){
return new Audi();
}else if("比亚迪".equals(type)){
return new Byd();
}else{
return null;
}
}
}
package com.test.factory.simple;
/**
* 简单工厂情况下
*/
public class Client02 { //调用者 不依赖Audi、Byd
public static void main(String[] args) {
Car c1 = CarFactory.createCar("奥迪");
Car c2 = CarFactory.createCar("比亚迪"); c1.run();
c2.run();
}
}
或者
package com.test.factory.simple; public class CarFactory2 {
public static Car createAudi(){
return new Audi();
}
public static Car createByd(){
return new Byd();
}
}
package com.test.factory.simple;
/**
* 简单工厂情况下
*/
public class Client03 { //调用者 不依赖Audi、Byd
public static void main(String[] args) {
Car c1 = CarFactory2.createAudi();
Car c2 = CarFactory2.createByd(); c1.run();
c2.run();
}
}
二、【GOF23设计模式】_工厂方法模式详解
package com.test.factory.factorymethod; public interface Car {
public void run();
} package com.test.factory.factorymethod; public class Audi implements Car{
@Override
public void run() {
System.out.println("奥迪在跑");
}
} package com.test.factory.factorymethod; public class Byd implements Car{
@Override
public void run() {
System.out.println("比亚迪在跑");
}
}
package com.test.factory.factorymethod; public interface CarFactory {
Car createCar();
} package com.test.factory.factorymethod; public class AudiFactory implements CarFactory{
@Override
public Car createCar() {
return new Audi();
}
} package com.test.factory.factorymethod; public class BydFactory implements CarFactory{
@Override
public Car createCar() {
return new Byd();
}
}
package com.test.factory.factorymethod; public class Client {
public static void main(String[] args) {
Car c1 = new AudiFactory().createCar();
Car c2 = new BydFactory().createCar(); c1.run();
c2.run();
}
}
三、【GOF23设计模式】_抽象工厂模式详解
package com.test.factory.abstractfactory; public interface Engine {
void run();
void start();
} class LuxuryEngine implements Engine{
@Override
public void run() {
System.out.println("转得快");
} @Override
public void start() {
System.out.println("启动快!可以自动启停");
}
} class LowEngine implements Engine{
@Override
public void run() {
System.out.println("转得慢");
} @Override
public void start() {
System.out.println("启动慢!");
}
}
package com.test.factory.abstractfactory; public interface Seat {
void massage();
} class LuxurySeat implements Seat{
@Override
public void massage() {
System.out.println("可以自动按摩");
}
} class LowSeat implements Seat{
@Override
public void massage() {
System.out.println("不能按摩");
}
}
package com.test.factory.abstractfactory; public interface Tyre {
void revolve();
} class LuxuryTyre implements Tyre{
@Override
public void revolve() {
System.out.println("旋转不磨损");
}
} class LowTyre implements Tyre{
@Override
public void revolve() {
System.out.println("旋转磨损快");
}
}
package com.test.factory.abstractfactory; public interface CarFactory {
Engine createEngine();
Seat createSeat();
Tyre createTyre();
}
package com.test.factory.abstractfactory; public class LuxuryFactory implements CarFactory{ @Override
public Engine createEngine() {
return new LuxuryEngine();
} @Override
public Seat createSeat() {
return new LuxurySeat();
} @Override
public Tyre createTyre() {
return new LuxuryTyre();
}
}
package com.test.factory.abstractfactory; public class LowFactory implements CarFactory{ @Override
public Engine createEngine() {
return new LowEngine();
} @Override
public Seat createSeat() {
return new LowSeat();
} @Override
public Tyre createTyre() {
return new LowTyre();
}
}
package com.test.factory.abstractfactory; public class Client {
public static void main(String[] args) {
CarFactory factory = new LuxuryFactory();
Engine e = factory.createEngine();
e.run();
e.start();
}
}
【GOF23设计模式】工厂模式的更多相关文章
- .NET设计模式: 工厂模式
.NET设计模式: 工厂模式(转) 转自:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html .NET设计模式(1): ...
- 【设计模式】Java设计模式 -工厂模式
[设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...
- GOF23种设计模式-工厂模式
• 工厂模式: – 实现了创建者和调用者的分离. – 详细分类: • 简单工厂模式 • 工厂方法模式 • 抽象工厂模式 • 面向对象设计的基本原则: – OCP(开闭原则,Open-Closed Pr ...
- 设计模式GOF23之工厂模式01
简单工厂模式和工厂方法模式 工厂模式核心:分工 简单工厂模式不符合OCP(Open-Closed Princinple)原则,扩展时需要更改原代码 工厂方法模式增加了类复杂度代码复杂度等,所以一般使用 ...
- [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- javascript 设计模式-----工厂模式
所谓的工厂模式,顾名思义就是成批量地生产模式.它的核心作用也是和现实中的工厂一样利用重复的代码最大化地产生效益.在javascript中,它常常用来生产许许多多相同的实例对象,在代码上做到最大的利用. ...
- JavaScript设计模式——工厂模式
工厂模式:是一种实现“工厂”概念的面上对象设计模式.实质是定义一个创建对象的接口,但是让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行.创建一个对象常常需要复杂的过程,所以不 ...
- 10.Java设计模式 工厂模式,单例模式
Java 之工厂方法和抽象工厂模式 1. 概念 工厂方法:一抽象产品类派生出多个具体产品类:一抽象工厂类派生出多个具体工厂类:每个具体工厂类只能创建一个具体产品类的实例. 即定义一个创建对象的接口(即 ...
- 学习:java设计模式—工厂模式
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Facto ...
- 设计模式——工厂模式 (C++实现)
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累. ...
随机推荐
- DataTable转Entity(Emit版)
public static List<T> ToList<T>(DataTable dt) { List<T> list = n ...
- NotSupportedException-无法将类型“System.DateTime”强制转换为类型“System.Object”
几张图就可以说明一切 2015-03-29 21:54:09,206 [77] ERROR log - System.NotSupportedException: 无法将类型“System.DateT ...
- 实战MEF(4):搜索范围
在前面的文章中,几乎每个示例我们都会接触到扩展类的搜索位置,我们也不妨想一下,既然是自动扩展,它肯定会有一个或者多人可供查找的位置,不然MEF框架怎么知道哪里有扩展组件呢? 就像我们用导航系统去查找某 ...
- OpenCASCADE Hidden Line Removal
OpenCASCADE Hidden Line Removal eryar@163.com Abstract. To provide the precision required in industr ...
- Create Volume 操作(Part III) - 每天5分钟玩转 OpenStack(52)
本节是创建 Volume 的第三部分,也是最后一部分:cinder-volume 的处理过程. 第一部分和第二部分可以参考前面两个小节.cinder-volume 通过 driver 创建 volum ...
- MyEclipse 2014跟2015破解
最近一直在弄后台开发,之前用idea感觉用的很不习惯,于是就换了myeclipse,两年多没有用myeclipse了,版本都很高了,记得我们之前用myeclipse8.5版本的时候,注册码什么的直接运 ...
- ASP.NET MVC Authorization 自定义跳转
应用场景:在 ASP.NET MVC 应用程序中,需要对用户身份权限进行验证,比如没有登录或者不符合权限的用户,访问 Action 的时候,跳转到指定页面. 重写 Authorize: public ...
- Markdown 语法整理
Markdown 语法整理 白宁超 2015年7月24日14:57:49 一.字体设置 A First Level Header == A Second Level Header -- # 标题 ## ...
- struts2学习笔记--使用struts2插件实现ajax处理(返回json数据)
贴一个简单的例子,通过jquery的post调用action,定义一个对象User,有name和age属性,实例化几个对象,以json的格式返回到jsp,在前台页面显示出来,模拟用户列表. 导入相关j ...
- WebGIS中一种根据网格索引判断点面关系的方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 判断点面关系的算法有很多,在我之前的博文中有一篇专门对其进行 ...