JAVA设计模式之工厂系列(factory)
任何可以产生对象的方法或者类,都可以称之为工厂。单例就是所谓的静态工厂。
为什么jdk中有了new,还需要工厂呢?
a、灵活的控制生产过程
b、给对象加修饰、或者给对象加访问权限,或者能够在对象生产过程中添加一些日志信息,再或者根据应用场景添加一些实际的业务处理等等。
1、静态工厂
单例模式:一种特殊的静态工厂,请参考单例模式
2、简单工厂
/**
* 可移动的物体抽象接口
*/
public interface Moveble { }
/**
* 食品抽象类
*/
public abstract class Food{
}
/**
* 面包类
*/
public class bread extends Food {
public Bike(){
System.out.println("T am bread");
}
}
/**
* bike类
*/
public class Bike implements Moveble{
public Bike(){
System.out.println("T am bike");
}
}
/**
* car类
*/
public class Car implements Moveble{
public Car(){
System.out.println("I am car");
}
}
/**
* 简单工厂 只要是类都可以生产
*/
public class SimplerFactory {
public Moveble createCar(){
return new Car();
}
public Moveble createBike(){
return new Bike();
}
public Food createBread(){
return new Bread();
}
}
/**
* 测试类
*/
public class T {
public static void main(String[] args) {
//生产car
Moveble car = new SimplerFactory().createCar();
//生产bike
Moveble bike = new SimplerFactory().createBike();
//生产bike
Food bread = new SimplerFactory().createBread();
}
}
3、工厂方法
/**
* 可移动的物体抽象接口
*/
public abstract interface Moveble {
} /**
* 食品抽象类
*/
public abstract class Food {
} /**
* bike类
*/
public class Bike implements Moveble{
public Bike(){
System.out.println("T am bike");
}
} /**
* car类
*/
public class Car implements Moveble{
public Car(){
System.out.println("I am car");
}
} /**
* bread类
*/
public class Bread extends Food{
public Bread(){
System.out.println("T am bread");
}
} /**
* bike工厂
*/
public class BikeFactory {
public Moveble create(){
return new Bike();
}
} /**
* car工厂
*/
public class CarFactory {
public Moveble create(){
return new Car();
}
} /**
* bread工厂
*/
public class BreadFactory {
public Food create(){
return new Bread();
}
} /**
* 测试类 ,工厂方法 一种类一个工厂
*/
public class T {
public static void main(String[] args) {
//生产car
Moveble car = new BikeFactory().create();
//生产bike
Moveble bike = new CarFactory().create();
//生产bread
Food bread = new BreadFactory().create();
}
}
4、抽象工厂
/**
* 食品抽象类
*/
public abstract class Food {
} /**
* 交通工具抽象类
*/
public abstract class Transportation {
} /**
* 电子设备抽象类
*/
public abstract class Electronic {
} /**
* bread类
*/
public class Bread extends Food {
public Bread(){
System.out.println("T am bread");
}
} /**
* plane类
*/
public class Plane extends Transportation{
public Plane(){
System.out.println("I am plane");
}
} /**
* phone类
*/
public class Phone extends Electronic{
public Phone(){
System.out.println("I am phone");
}
} /**
* 具体的工厂 可以生产一组类
*/
public class HaierFactory extends AbstractFactory{ Food createFood() {
return new Bread();
} Electronic createElectronic() {
return new Phone();
} Transportation createTransportation() {
return new Plane();
}
} /**
* cake类
*/
public class Cake extends Food {
public Cake(){
System.out.println("T am cake");
}
} /**
* Tank类
*/
public class Tank extends Transportation{
public Tank(){
System.out.println("I am tank");
}
} /**
* Computer类
*/
public class Computer extends Electronic{
public Computer(){
System.out.println("T am pc");
}
} /**
* 具体的工厂,可以生产一组类
*/
public class SuningFactory extends AbstractFactory{
Food createFood() {
return new Cake();
}
Electronic createElectronic() {
return new Computer();
}
Transportation createTransportation() {
return new Tank();
}
} /**
* 测试类,抽象工厂可以生产一组类,并且可以很灵活的扩展一组类的创建过程,但是不能做到灵活扩展一种类
*/
public class T {
public static void main(String[] args) {
//海尔工厂可以生产面包 飞机 手机
AbstractFactory haierFactory = new HaierFactory();
Food bread = haierFactory.createFood();
Transportation plane = haierFactory.createTransportation();
Electronic phone = haierFactory.createElectronic();
//苏宁工厂可以生产 蛋糕 坦克 pc电脑
AbstractFactory suningFactory = new SuningFactory();
Food cate = haierFactory.createFood();
Transportation tank = haierFactory.createTransportation();
Electronic computer = haierFactory.createElectronic();
}
}
5、Spring的bean工厂
既可以灵活控制一组类的创建过程也可以灵活控制一种类的创建过程,具体请去阅读Spring源码中的BeanFactory。
JAVA设计模式之工厂系列(factory)的更多相关文章
- Java设计模式:Simple Factory(简单工厂)模式
概念定义 简单工厂(Simple Factory)模式,又称静态工厂方法(Static Factory Method)模式,即定义一个工厂类,根据传入的不同参数创建不同的产品实例,这些实例对象具有共同 ...
- Java设计模式:Abstract Factory(抽象工厂)模式
概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品) ...
- java设计模式解析(11) Chain责任链模式
设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...
- java设计模式解析(1) Observer观察者模式
设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析( ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
- Java设计模式(1)工厂模式(Factory模式)
工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
随机推荐
- 跨域cookies 共享
这是由于,本地调试.涉及到cookies的问题 想要跨域使用的问题 vue 中的mian.js中放入下面代码 import axios from 'axios' axios.defaults.with ...
- 怎么快速学python?酒店女服务员一周内学会Python,一年后成为程序员
怎么快速学python?有人说,太难!但这个女生却在一个星期内入门Python,一个月掌握python所有的基础知识点. 说出来你应该不信,刚大学毕业的女生:琳,一边在酒店打工,一边自学python, ...
- Redis之ziplist源码分析
一.ziplist简介 从上一篇分析我们知道quicklist的底层存储使用了ziplist(压缩列表),由于压缩列表本身也有不少内容,所以重新开了一篇,在正式源码之前,还是先看下ziplist的特点 ...
- 利用 Github 网络钩子实现自动化部署
GitHub 的网络钩子(webhook)功能,可以很方便的实现自动化部署.本文记录了使用 Node.js 的开发部署过程,当项目的 master 分支被推时,将在服务器进行自动部署 添加网路钩子 在 ...
- python成功安装torch模块
最近项目要使用到torch模块,但是在安装的过程中发现torch直接使用pip install安装是安装不成功的.然后就百度,发现并没有什么卵用,所以就google一番,不禁感叹,这种新的东西,还是外 ...
- VCL安装有哪几种方法?
不是由Borland 提供的组件叫第三方组件: 就目前常见的各种形式的组件的安装方法介绍一下. 1.只有一个DCU文件的组件.DCU文件是编译好的单元文件,这样的组件是作者不想把源码公布.一般来说,作 ...
- 熬夜整理出来的干货:Python+Pycharm+PyQT5可视化程序设计入门
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:朱淑强 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...
- C++11<functional>深度剖析
自C++11以来,C++标准每3年修订一次.C++14/17都可以说是更完整的C++11:即将到来的C++20也已经特性完整了. C++11已经有好几年了,它的年龄比我接触C++的时间要长10倍不止吧 ...
- vue2.x学习笔记(九)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12577948.html. 数组的更新检测 数组在javascript是一种特殊的对象,不是像普通的对象那样通过Ob ...
- react-devtools安装调试
初学react,Chrome F12调试,需要一款插件react-devtools. 网上大多对于翻墙不利索的同学大多才用了git源码.npm本地手动打包Chrome拓展程序.如:https://ww ...