03.设计模式之工厂模式
一、定义
- 任何可以产生对象的方法或类,都可以称之为工厂
- 单例也是一种工厂
- 为什么有了new之后,还需要有工厂?
①灵活控制生产过程
②权限、修饰、日志…
二、讲述
- Car类
public class Car {public void go(){System.out.println("Car can go bibibibi...");}
}
- Plane类
public class Plane {public void go(){System.out.println("Plane can go huhuhu...");}
}
- 主方法
public class Main {public static void main(String[] args) {//若想开车Car c = new Car();c.go();//若想开飞机Plane p = new Plane();p.go();}
}
1.任意定制交通工具(实现Moveable接口)
这时候若想开火车,主方法的代码还需要变,这时候我们想让主方法的代码变得没这么多,使他的可拓展性更好一些。
这时候我们可以创建一个接口,使交通工具去实现这个接口
- 接口类
public interface Moveable {void go();
}
- Car类
public class Car implements Moveable{public void go(){System.out.println("Car can go bibibibi...");}
}
- Plane类
public class Plane implements Moveable{public void go(){System.out.println("Plane can go huhuhu...");}
}
- Broom 扫帚类
public class Broom implements Moveable{@Overridepublic void go() {System.out.println("Broom can fly hulahula...");}
}
- 主方法
public class Main {public static void main(String[] args) {Moveable m = new Broom();m.go();}
}
2.任意定制生产过程(xxxFactory.create,返回是Moveable)
比如说实际当中的一个应用,如果new的时候要求设置相应的权限,因为对于每个权限是不一样的,就好比上面的Car,Plane,Broom的各自的权限都是不一样的,那么上面的编程方式就出现了短处。
于是这样,我们就可以把new的过程交给工厂。
2.1 简单工厂
/*** 简单工厂的方式很简单* 但是它的可扩展性很不好* 原因:例如当我们往里面新加一个交通工具的时候,我们又得往里面新加一个方法* 而且这个方法又是写死的了,所以它的可扩展性很不好*/
public class SimpleVehicleFactory {public Car createCar(){// before processingreturn new Car();}public Broom createBroom(){// before processingreturn new Broom();}}
因为简单工厂的可扩展性不好,所以我们可以针对每一种产品来做一个工厂
2.2 针对每种产品做一个工厂
- CarFactory
public class CarFactory {public Moveable createCar(){System.out.println("a car created!");return new Car();}}
- 主方法
public class Main {public static void main(String[] args) {Moveable m = new CarFactory().createCar();m.go();}
}
所以这时候我们想创建一个新的交通工具,就先创建它的工厂类,然后去主方法把它new出来
3.任意定制产品一族(抽象工厂)
情景:
- Car类
public class Car {public void go(){System.out.println("Car can go bibibibi...");}
}
- Broom类
public class Broom {public void go(){System.out.println("Broom can fly wuwuuwu...");}
}
- Bread类
public class Bread {public void printName(){System.out.println("wdm");}
}
- MushRoom类
public class MushRoom {public void printName(){System.out.println("dmg");}
}
- AK47类
public class AK47 {public void shoot(){System.out.println("tutututu....");}
}
- MagicStick类
public class MagicStick {public void shoot(){System.out.println("diandian....");}
}
- 主方法
public class Main {public static void main(String[] args) {//添加一个现代人的产品族Car c = new Car();c.go();AK47 ak47 = new AK47();ak47.shoot();Bread bread = new Bread();bread.printName();}
}
从上面可以发现,添加一个产品族是要在主方法中很麻烦的,那么要怎么灵活扩展产品一族呢?
3.1 抽象工厂
- Food类
public abstract class Food {abstract void printName() ;
}
- Weapon类
/*** 武器*/
public abstract class Weapon {abstract void shoot() ;
}
- Vehicle类
public abstract class Vehicle {abstract void go() ;
}
接下来就是让Bread和MushRoom继承Food,AK47和MagicStick继承Weapon,Car和Broom继承Vehicle
- ModernFactory
public class ModernFactory extends AbstractFactory {@OverrideFood createFood() {return new Bread();}@OverrideWeapon createWeapon() {return new AK47();}@OverrideVehicle createVehicle() {return new Car();}
}
- MagicFactory
public class MagicFactory extends AbstractFactory {@OverrideFood createFood() {return new MushRoom();}@OverrideWeapon createWeapon() {return new MagicStick();}@OverrideVehicle createVehicle() {return new Broom();}
}
- Main方法
public class Main {public static void main(String[] args) {// 若想用魔法族的时候,就把ModernFactory改为MagicFactoryAbstractFactory f = new ModernFactory();Vehicle c = f.createVehicle();c.go();Weapon w = f.createWeapon();w.shoot();Food food = f.createFood();food.printName();}
}
4.总结
普通工厂比较容易扩展,就如普通工厂,这个工厂可以拓展车,AK47,面包…
但是如果是产品一族的话,抽象工厂,就不好拓展,就如上面所说要加上火星人的产品一族的话,那么就要添加新的交通工具,新的食品,新的攻击方式,这其中又要可能在抽象方法中修改许多。
抽象工厂例子:坦克的坦克一族,生活中QQ皮肤全部换…
03.设计模式之工厂模式相关推荐
- Java设计模式之工厂模式篇 (转)
Java设计模式之工厂模式篇 (转)[@more@]Java设计模式之工厂模式篇 作者:冯睿 本文选自:赛迪网 2003年03月07日 .NET.com.cn/servlets/ad?Pool=te ...
- Java设计模式(工厂模式>抽象工厂模式和原型模式)
Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...
- JavaScript设计模式--简单工厂模式例子---XHR工厂
JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...
- 三角形圆形创建与擦除java_设计模式---------------简单工厂模式
设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...
- 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式
设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...
- Java 设计模式之工厂模式(二)
原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...
- 设计模式之工厂模式(三)
上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...
- php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式
php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...
- 教你如何一篇博客读懂设计模式之—--工厂模式
一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...
- 一篇博客读懂设计模式之---工厂模式
设计模式之-工厂模式 工厂模式: 创建过程: 创建Shape接口 public interface Shape {void draw(); } 创建实现类: public class Circle i ...
最新文章
- jsp连接mysql数据库 例子_jsp连接mysql数据库的例子
- 代码实现UISlider 和 UISwitch
- WorldWind Java 版学习:8、事件响应
- Hyperledger Besu(2)隐私
- 3、java基础:抽象类与接口的区别
- 首个视觉-语言预训练综述来了!
- Java面试题:单例设计模式、适配器模式的不同方式
- 应用容灾中,MySQL数据表是否需要跨云同步?
- 打造一款便携版的Sublime Text
- idea code key study form qinChao
- Oracle 相关知识点结构图
- 2020辅警考试计算机知识题,2019年辅警考试题库:计算机概述-计算机软件系统
- 操作系统实验报告fcfs算法c语言,操作系统实验报告 作业调度实验报告...
- 计算机课签到本,学生课堂签到系统的设计与实现.pdf
- php探针作用,php探针使用原理和技巧讲解
- 激活函数(激励函数)理解总结
- bootstrap FileInput多文件上传插件使用详解(包括Java代码)
- 计算两个时间之间的进度百分比
- 生产计划排产的十二个应用场景
- RNA_seq表达分析