1、简单工厂模式(静态工厂方法模式)

抽象实例:

public interface People {
void talk();
}

具体实例:

public class Doctor implements People {
public void talk() {
System.out.println("我是医生");
}
}
public class Teacher implements People {
public void talk() {
System.out.println("我是教师");
}
}

具体工厂

public class Factory {
public static People createInstance(String flag){
if("doctor".equals(flag)){
return new Doctor();
}
if("teacher".equals(flag)){
return new Teacher();
}
return null;
}
}

测试类:

public class Test {
public static void main(String[] args){
People people = Factory.createInstance("doctor");
people.talk();
people = Factory.createInstance("teacher");
people.talk();
}
}
我是医生
我是教师

该模式的缺点:增加 具体实例  需要修改工厂类

2、工厂方法模式

抽象实例:

public interface People {
void talk();
}

具体实例:

public class Doctor implements People {
public void talk() {
System.out.println("我是医生");
}
}
public class Teacher implements People {
public void talk() {
System.out.println("我是教师");
}
}

抽象工厂

public abstract class AbstractFactory {
abstract People createInstance();
}

具体工厂

public class DoctorFactory extends AbstractFactory {
People createInstance() {
return new Doctor();
}
}
public class TeacherFactory extends AbstractFactory {
People createInstance() {
return new Teacher();
}
}

测试类:

public class Test {
public static void main(String[] args){
AbstractFactory doctorFactory = new DoctorFactory();
AbstractFactory teacherFactory = new TeacherFactory();
doctorFactory.createInstance().talk();
teacherFactory.createInstance().talk();
}
}
我是医生
我是教师

该模式的相对于 简单工厂模式 来说,如果要增加新的 具体实例  不需要修改原来的工厂方法,只需要新增一个 具体工厂。缺点就是当 具体实例 很多的时候,会增加很多与之对应的 具体工厂

3、抽象工厂模式

抽象实例和具体实例和前面的一样,此处省略不写

抽象工厂

public interface AbstractFactory {
People createDoctorInstance();
People createTeacherInstance();
}

具体工厂

public class ConcreteFactory  implements AbstractFactory {

    public People createDoctorInstance() {
return new Doctor();
} public People createTeacherInstance() {
return new Teacher();
}
}

测试类:

public class Test {
public static void main(String[] args){
AbstractFactory doctorFactory = new ConcreteFactory();
doctorFactory.createDoctorInstance().talk();
doctorFactory.createTeacherInstance().talk();
}
}
我是医生
我是教师

该模式缺点和简单工厂模式一样:增加 具体实例 需要修改 工厂类。

4、工厂模式与反射结合,实现新增 具体实例 不需要修改和新增 工厂类

抽象实例和具体实例和前面的一样,此处省略不写

具体工厂

public class ReflectFactory {
public People createInstance(String className) throws Exception {
Class<?> cls = Class.forName(className);
People people = (People) cls.newInstance();
return people;
}
}

测试类:

public class Test {
public static void main(String[] args) throws Exception {
ReflectFactory reflectFactory = new ReflectFactory();
reflectFactory.createInstance("factory.demo.Doctor").talk();
reflectFactory.createInstance("factory.demo.Teacher").talk();
}
}
我是医生
我是教师

java常用设计模式二:工厂模式的更多相关文章

  1. Java常见设计模式之工厂模式

    工厂模式在我们日常的应用中应当算是比较广泛的一种设计模式了.今天让我们一起来学习一下,工厂的设计模式. 工厂模式在<Java与模式>中分为三类:     1)简单工厂模式(Simple F ...

  2. Java设计模式02:常用设计模式之工厂模式(创建型模式)

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的.  工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Fact ...

  3. java常用设计模式总览

    一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...

  4. JAVA常用设计模式(一、单例模式、工厂模式)

    JAVA设计模式之单例模式 import java.util.HashMap; import java.util.Map; /** * 设计模式之单例模式 * 单例模式(Singleton Patte ...

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

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

  6. 浅析JAVA设计模式之工厂模式(二)

    1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...

  7. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

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

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

  9. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

随机推荐

  1. winbox添加dhcp和nat

    例子如上,wan连接外网,lan作为内网. 设置网卡ip 保证mac地址正确! 去到ip address里,设置两网卡的ip! 保证能ping通外网! 设置dhcp ip pool添加池,192.16 ...

  2. [剑指Offer]40-最小的k个数

    题目链接 https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&t ...

  3. 小程序循环多个picker选择器,实现动态增、减

    现象 循环picker选择器,改变一个下拉框选项,导致全部下拉框选项改变: 问题 怎样操作才能实现只改变当前操作的下拉框的值? 思路 在js中设置一个数组变量,存储每个picker选择器默认的值:然后 ...

  4. js拷贝指定内容到剪切板

    function copyTextToClipboard(text) { var textArea = document.createElement("textarea"); te ...

  5. selenium无界面chromedriver

    chromeDriver下载地址:http://chromedriver.storage.googleapis.com/index.html 谷歌浏览器Chrome和驱动程序的对照表https://b ...

  6. Android开发之对ListView的数据进行排序

    这里涉及到对ListView的数据进行排序,以及ListView的数据如何清空处理.排序的方法相同,但是里面的数据集合有些区别:一种是利用pojo类取得数据:另一种是利用map来取得数据. 第一种:利 ...

  7. 在电脑上查看小米手机连接wifi时保存的密码

    手机连接的wifi,想另一个手机也连上,密码忘了. 先备份手机的资料,然后将手机连上电脑,在SD卡上MIUI-backup-allbackup文件夹中, 找到刚才备份的文件夹 点进去找到WLAN设置. ...

  8. LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流

    #6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  9. Codeforces 757C. Felicity is Coming!

    C. Felicity is Coming! time limit per test:2 seconds memory limit per test:256 megabytes input:stand ...

  10. djiango控制语句

    {# 从0开始的索引#} {% for foo in value %} {# 从0开始的索引#} <p>{{ forloop.counter0 }}: {{ foo }}</p> ...