一、定义

  • 任何可以产生对象的方法或类,都可以称之为工厂
  • 单例也是一种工厂
  • 为什么有了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.设计模式之工厂模式相关推荐

  1. Java设计模式之工厂模式篇 (转)

    Java设计模式之工厂模式篇 (转)[@more@]Java设计模式之工厂模式篇 作者:冯睿  本文选自:赛迪网 2003年03月07日 .NET.com.cn/servlets/ad?Pool=te ...

  2. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  3. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  4. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  5. 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式

    设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...

  6. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  7. 设计模式之工厂模式(三)

    上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...

  8. php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式

    php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...

  9. 教你如何一篇博客读懂设计模式之—--工厂模式

    一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...

  10. 一篇博客读懂设计模式之---工厂模式

    设计模式之-工厂模式 工厂模式: 创建过程: 创建Shape接口 public interface Shape {void draw(); } 创建实现类: public class Circle i ...

最新文章

  1. jsp连接mysql数据库 例子_jsp连接mysql数据库的例子
  2. 代码实现UISlider 和 UISwitch
  3. WorldWind Java 版学习:8、事件响应
  4. Hyperledger Besu(2)隐私
  5. 3、java基础:抽象类与接口的区别
  6. 首个视觉-语言预训练综述来了!
  7. Java面试题:单例设计模式、适配器模式的不同方式
  8. 应用容灾中,MySQL数据表是否需要跨云同步?
  9. 打造一款便携版的Sublime Text
  10. idea code key study form qinChao
  11. Oracle 相关知识点结构图
  12. 2020辅警考试计算机知识题,2019年辅警考试题库:计算机概述-计算机软件系统
  13. 操作系统实验报告fcfs算法c语言,操作系统实验报告 作业调度实验报告...
  14. 计算机课签到本,学生课堂签到系统的设计与实现.pdf
  15. php探针作用,php探针使用原理和技巧讲解
  16. 激活函数(激励函数)理解总结
  17. bootstrap FileInput多文件上传插件使用详解(包括Java代码)
  18. 计算两个时间之间的进度百分比
  19. 生产计划排产的十二个应用场景
  20. RNA_seq表达分析

热门文章

  1. 企业ERP系统如何选择?
  2. firewalld 规则配置
  3. 永远的道长——林正英
  4. 服装计算机辅助设计论文,服装设计计算机辅助设计应用探索-服装设计论文-设计论文.docx...
  5. 机房ip和住宅ip的区别是什么?
  6. 百度网盘 api抓包
  7. 罗永浩,天下“老赖”不独你一人!6位创业明星的陨落
  8. u盘服务器安装win7系统,服务器u盘安装win7系统
  9. elvui显示服务器,魔兽世界怀旧服ElvUI插件
  10. HSC-1th misc——DORAEMON