介绍:
工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。

形态:
简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory Method Pattern) ,不利于产生系列产品;
工厂方法(Factory Method)模式,又称多态性工厂(Polymorphic Factory)模式 或虚拟构造子(Virtual Constructor)模式;
抽象工厂(Abstract Factory)模式,又称工具箱(Kit 或Toolkit)模式,产生产品族,但不利于产生新的产品;
这三种模式从上到下逐步抽象,并且更具一般性。

简单工厂模式:

介绍:
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据自变量的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

角色:
工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体Java 类实现。 抽象产品(Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个Java 接口或者Java 抽象类实现。
具体产品(Concrete Product)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java 类实现。

适用环境:
工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂;
客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

package factory;
/** 简单工厂模式*/
public abstract class Computer {public abstract void start();
}
package factory;
/** 简单工厂模式*/
public class LenovoComputer extends Computer {@Overridepublic void start() {System.out.println("生成联想电脑");}}
package factory;
/** 简单工厂模式*/
public class HpComputer extends Computer{@Overridepublic void start() {System.out.println("生成惠普电脑");}}
package factory;
/** 简单工厂模式*/
public class AsusComputer extends Computer{@Overridepublic void start() {System.out.println("生成华硕电脑");}}
package factory;
/** 简单工厂模式*/
public class ComputerFactory {public static Computer creatComputer(String type){Computer computer = null;switch(type){case "hp": computer = new HpComputer();break;case "lenovo": computer = new LenovoComputer();break;case "asus": computer = new AsusComputer();break;}return computer;        }}
package factory;
/** 简单工厂模式*/
public class CreatComputer {public static void main(String[] args) {ComputerFactory.creatComputer("asus").start();ComputerFactory.creatComputer("hp").start();ComputerFactory.creatComputer("asus").start();ComputerFactory.creatComputer("lenovo").start();ComputerFactory.creatComputer("asus").start();}
}

工厂方法模式:

介绍:
工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method是一个类的实例化延迟到其子类。
在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

角色:
抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。在上面的系统中这个角色由Java 接口Creator 扮演;在实际的系统中,这个角色也常常使用抽象Java 类实现。
具体工厂(Concrete Creator)角色:担任这个角色的是实现了抽象工厂接口的具体Java 类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。在本系统中给出了两个这样的角色,也就是具体Java类ConcreteCreator1 和ConcreteCreator2。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在本系统中,这个角色由Java 接口Product 扮演;在实际的系统中,这个角色也常常使用抽象Java 类实现。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。

适用环境:
一个类不知道它所需要的对象的类:在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建;客户端需要知道创建具体产品的工厂类。
一个类通过其子类来指定创建哪个对象:在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无需关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。

package factory;
/** 工厂方法模式*/
public interface Human {public void getColor();//皮肤颜色public void getTalk();//语言}
package factory;
/** 工厂方法模式*/
public class BlackHuman implements Human {@Overridepublic void getColor() {System.out.println("黑人是黑色的皮肤");}@Overridepublic void getTalk() {System.out.println("黑人说的是非洲言语");}}
package factory;
/** 工厂方法模式*/
public class YelloHuman implements Human{@Overridepublic void getColor() {System.out.println("黄人是黄色皮肤");}@Overridepublic void getTalk() {System.out.println("黄人说的是汉语");}}
package factory;
/** 工厂方法模式*/
public class WhiteHuam implements Human{@Overridepublic void getColor() {System.out.println("白人是白色皮肤");}@Overridepublic void getTalk() {System.out.println("白人说的是英语");}}
package factory;
/** 工厂方法模式*/
public abstract class AbstractHumanFactory {public abstract <T extends Human> T creatHuman(Class<T> c);
}
package factory;
/** 工厂方法模式*/
public class HumanFactory extends AbstractHumanFactory{@Overridepublic <T extends Human> T creatHuman(Class<T> c) {Human human = null;try {human = (Human) Class.forName(c.getName()).newInstance();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}return (T) human;}}
package factory;
/** 工厂方法模式*/
public class CreatHuman {public static void main(String[] args) {AbstractHumanFactory abstractHumanFactory = new HumanFactory();Human whiteHuman = abstractHumanFactory.creatHuman(WhiteHuam.class);//创造白色人种whiteHuman.getColor();whiteHuman.getTalk();Human yelloHuman = abstractHumanFactory.creatHuman(YelloHuman.class);//创造黄色人种yelloHuman.getColor();yelloHuman.getTalk();Human blackHuman = abstractHumanFactory.creatHuman(BlackHuman.class);//创造黑色人种blackHuman.getColor();blackHuman.getTalk();}}

抽象工厂模式:

介绍:
抽象工厂模式提供一个创建一系列或相互依赖的对象的接口,而无需指定它们具体的类。

角色:
抽象工厂(AbstractFactory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用Java 接口或者抽象Java 类实现,而所有的具体工厂类必须实现这个Java 接口或继承这个抽象Java 类。
具体工厂类(Conrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。通常使用具体Java 类实现这个角色。
抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用Java 接口或者抽象Java 类实现这一角色。
具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。通常使用具体Java 类实现这个角色。

适用环境:
一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。这对于所有形态的工厂模式都是重要的;
一个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品;
同属于同一个产品族的产品是在一起使用的,这一约束必须要在系统的设计中体现出来; 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

package factory;
/** 抽象工厂模式*/
public abstract class Phone{protected String model;//手机型号 protected String name;//手机名字 // 构造器  public Phone(String name,String model) {  this.name = name;  this.model = model;  }public abstract void call();
}
package factory;
/** 抽象工厂模式*/
public class HuaWei extends Phone{public HuaWei(String name, String model) {super(name, model);}@Overridepublic void call() {System.out.println(name+" "+model);System.out.println("华为呼叫");}}
package factory;
/** 抽象工厂模式*/
public class Vivo extends Phone{public Vivo(String name, String model) {super(name, model);// TODO Auto-generated constructor stub}@Overridepublic void call() {System.out.println(name+" "+model);System.out.println("vovi呼叫");}}
package factory;
/** 抽象工厂模式*/
public class Oppo extends Phone{public Oppo(String name, String model) {super(name, model);// TODO Auto-generated constructor stub}@Overridepublic void call() {System.out.println(name+" "+model);System.out.println("oppo呼叫");}}
package factory;
/** 抽象工厂模式*/
public abstract class AbstractPhoneFactory {public abstract Phone creatHuaWei();//生产华为手机public abstract Phone creatVivo();//生产vivo手机public abstract Phone creatOppo();//生产oppo手机}
package factory;
/** 抽象工厂模式*/
public class PhoneFactory extends AbstractPhoneFactory{@Overridepublic Phone creatHuaWei() {// TODO Auto-generated method stubreturn new HuaWei("华为","1001");}@Overridepublic Phone creatVivo() {// TODO Auto-generated method stubreturn new Vivo("Vivo", "1002");}@Overridepublic Phone creatOppo() {// TODO Auto-generated method stubreturn new Oppo("oppo", "1003");}}
package factory;
/** 抽象工厂模式*/
public class CreatPhone {public static void main(String[] args) {AbstractPhoneFactory abstractPhoneFactory = new PhoneFactory();Phone phone1 = abstractPhoneFactory.creatHuaWei();phone1.call();Phone phone2 = abstractPhoneFactory.creatVivo();phone2.call();Phone phone3 = abstractPhoneFactory.creatOppo();phone3.call();}}

请关注“知了堂学习社区”,地址:http://www.zhiliaotang.com/portal.php

[知了堂学习笔记]_设计模式之工厂模式相关推荐

  1. [知了堂学习笔记]_网络基础知识_1.OSI参考模型(网络七层协议)

    OSI参考模型是国际标准化组织ISO制定的模型,把计算机与计算机之间的通信分成七个互相连接的协议层,如图: 1.1各层功能 1.物理层 最底层是物理层,这一次负责传送比特流,它从第二层数据接收数据帧, ...

  2. [知了堂学习笔记]_牵线Eclipse和Tomcat第一篇 —— 配置Java环境变量安装eclipse

    一.先给他们提供一个"浪漫的"环境,比如传说中的"鹊桥"--java环境变量.哈哈! 配置java环境变量. 下载jdk,根据自己电脑的版本和操作位数选择不同的 ...

  3. [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第2讲(四大界面之间的跳转与玩家飞机的移动)

    一.通过点击按钮事件,实现四大界面之间的跳转: (一)跳转的思路: 1.打开软件,只显示登录界面(隐藏游戏界面.暂停界面.玩家死亡界面) 2.点击微信登录(QQ登录)跳转到游戏界面,隐藏登录界面 3. ...

  4. 【知了堂学习笔记】java 自定义异常

    [知了堂学习笔记]java 自定义异常 参考文章: (1)[知了堂学习笔记]java 自定义异常 (2)https://www.cnblogs.com/pipixiao/p/7419902.html ...

  5. [知了堂学习笔记]根据银行卡号匹配银行卡类型

    银行卡类型匹配代码 原理:通过银行卡前6或前8位对银行卡类型进行匹配,返回对应的银行类型 代码: package com.finalcial.util;/*** 通过银行的Bin号 来获取 银行名称 ...

  6. [知了堂学习笔记]_Java中线程的学习(一)

    请关注"知了堂学习社区",地址:http://www.zhiliaotang.com/portal.php 线程 1.线程的概念 线程,有时被称为轻量级进程(Lightweight ...

  7. 【知了堂学习笔记】_Java笔试题整理(二)

    请关注"知了堂学习社区",地址:http://www.zhiliaotang.com/portal.php 1.请大概描述一下Vector和ArrayList的区别,Hashtab ...

  8. 【知了堂学习笔记】_JavaScript之DOM操作(英语在线翻译)

    请关注"知了堂学习社区",地址:http://www.zhiliaotang.com/portal.php 此案例样式粗糙,主要注重功能实现!! <!DOCTYPE html ...

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

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

最新文章

  1. Xamarin.Android真机测试提示[INSTALL_FAILED_UPDATE_INCOMPATIBLE]
  2. vue 动态变量名_【告别复制粘贴】动态模板生成小技巧
  3. android布局中使用include及需注意点
  4. java面试总结(一)-----如何准备Java初级和高级的技术面试
  5. python创建百万个文件_python百万sitemap制作
  6. Brave 浏览器宣布集成 IPFS 协议,它会取代 HTTP 吗?
  7. oracle数据库十六进制转字符串,Oracle中各种进制相互转换
  8. [转载] JAVA出现空指针异常(初学者)
  9. cpp存储类型说明符(storage class specifier)
  10. snipaste如何滚动截图_试用了20个截图工具,我写下这份超全的软件指南
  11. 惠斯通电桥平衡条件推导
  12. 康托尔、哥德尔、图灵——永恒的金色对角线(rev#2)
  13. K.gather()
  14. 毛玻璃 / 玻璃拟态 处理 backdrop-filter 兼容性问题
  15. VS2015编辑图片
  16. python输入一个三位整数、输出三位数之和_编写程序,从键盘输入一个3位的正整数,输出它的百位数,十位数和个位数,并且计算它的和...
  17. 根据起始日期、起始时间、终止日期、终止时间计算天数
  18. 通过 Nginx 实现多机负载均衡
  19. 用户贷款风险预测之Top10初体验
  20. ORB-SLAM3 单目惯导ros-system-track

热门文章

  1. Do not use “@ts-ignore“ because it alters compilation errors(ts严格模式未关闭导致的项目启动失败的解决方案)
  2. oracle 表碎片化处理,oracle数据库碎片化管理
  3. 2021 红米6A MIUI11稳定版刷开发版 方法
  4. 两个月备战PMP经验总结(转)
  5. Redis 抽奖大转盘的实战示例
  6. 百度收YY:挥剑直播,意在电商?
  7. Spark Streaming揭秘 Day14 State状态管理
  8. 微信小程序获取元素节点并对其进行操作
  9. 【转】如何解决每次打开office2010都会出现正在配置以及使用KMS
  10. Ae:蒙版跟踪(含脸部跟踪)