任何可以产生对象的方法或者类,都可以称之为工厂。单例就是所谓的静态工厂。

为什么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)的更多相关文章

  1. Java设计模式:Simple Factory(简单工厂)模式

    概念定义 简单工厂(Simple Factory)模式,又称静态工厂方法(Static Factory Method)模式,即定义一个工厂类,根据传入的不同参数创建不同的产品实例,这些实例对象具有共同 ...

  2. Java设计模式:Abstract Factory(抽象工厂)模式

    概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品) ...

  3. java设计模式解析(11) Chain责任链模式

    设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...

  4. java设计模式解析(1) Observer观察者模式

      设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析( ...

  5. Java设计模式之工厂模式(Factory模式)介绍(转载)

    原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...

  6. Java设计模式(1)工厂模式(Factory模式)

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...

  7. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  8. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  9. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

随机推荐

  1. AJ学IOS(36)UI之手势事件旋转_缩放_拖拽

    AJ分享,必须精品 效果 完成一个图片的捏合缩放,拖拽,旋转动作. 设计思路 拖拽: 首先是最简单的拖拽 //拖拽 -(void)panTest { UIPanGestureRecognizer *p ...

  2. [模板]SPFA判负环

    目录 一.BFS法判负环 二.DFS法判负环 三.SPFA判正环 一.BFS法判负环 Code: #include<bits/stdc++.h> #define re register # ...

  3. 【LeetCode】23.合并K个排序链表

    题目描述 23.合并K个排序链表 合并k个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] ...

  4. Python-气象-大气科学-可视化绘图系列(一)——利用xarray读取netCDF文件并画图(代码+示例)

    本文原创链接:https:////www.cnblogs.com/zhanling/p/12192978.html 1 import numpy as np import xarray as xr i ...

  5. Extended Traffic LightOJ - 1074 (经典SPFA问题)

    题目大意:每一个城市都有一定的繁荣度,然后给出m条有向边i->j,定义这条边的权值为pow(arr[j]-arr[i],3),然后给你q个询问,每个询问输入一个x. 然后问你点1到x的距离,如果 ...

  6. SQL语句加锁分析

    背景 MySQL中SQL加锁的情况十分复杂,不同隔离级别.不同索引类型.索引是否命中的SQL加锁各不相同. 然而在分析死锁过程当中,熟知各种情况的SQL加锁是分析死锁的关键,因此需要将MySQL的各种 ...

  7. JavaScript基础1225

    JavaScript函数 1.函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. tip:JavaScript对大小写敏感.关键词function必须是小写,并且必须以与函数名称相同的大小写 ...

  8. redis:String字符串类型(三)

    字符串拼接(如果key不存在则创建):append name " applesnt" 获取字符串的长度:strlen name 127.0.0.1:6379> set nam ...

  9. 有关HTTP协议

    有关HTTP协议:https://www.cnblogs.com/an-wen/p/11180076.html

  10. thinkphp5.0 url跳转

    <a href="{:url('member/index/index',['id'=>5])}">跳转</a> define()自定义常量在thiin ...