factory的“本质”就是根据不同的输入创建出不同类型的对象。

引入factory的原因就是你需要根据不同的输入创建不同类型的对象。

简单工厂模式相当于是一个工厂中有各种产品,创建在一个类中,客户无需知道具体产品的名称,只需要知道产品类所对应的参数即可。但是工厂的职责过重,而且当类型过多时不利于系统的扩展维护。

工厂方法模式相当于在简单工厂模式的基础上增加一个抽象工厂,在简单工厂模式下如果增加一个产品,要修改工厂类,不符合开闭原则。在工厂方法下,只需要增加具体工厂和具体产品即可。

抽象工厂,类似于一个集团旗下生产的各种产品的工厂,这些产品是一个产品族。是在工厂方法下的扩展。比如一个产品的界面,可以通过直接改变具体工厂的实例来改变产品的界面风格。

java版

package com.tsh.mthread;

public class Home {

    public static void main(String[] args) {
Factory factory = new GoodsFactory();
Product product =factory.instance();
product.todo();
} }
//这样感觉是工厂方法模式
//这是商品
class Product{
public void todo(){
System.out.println("使用商品...");
}
}
//这是工厂
abstract class Factory{
public abstract Product instance();
}
class GoodsFactory extends Factory{
public Product instance(){
return new Product();
}
}

js版:

<script type="text/javascript">
//这个应该是简单工厂模式
function Product(){
this.todo=function(){
console.log("使用商品");
}
}
function Factory(){
this.instance=function(){
return new Product();
}
}
var factory=new Factory();
product=factory.instance();
product.todo();
</script>

PHP版:

//PHP里面的工厂模式感觉最灵活啊
//这是商品
class Product{
public function todo(){
echo "使用商品...";
}
}
//这是工厂
class Factory{
public static function instance($className){
return new $className();
}
}
$product=Factory::instance('Product');
$product->todo();

[javaSE] 看知乎学习工厂模式的更多相关文章

  1. [javaSE] 看知乎学习反射

    简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息. 知乎:学习java应该如何理解反射?   余晖: 反射提供了一种运 ...

  2. 基于go语言学习工厂模式

    工厂模式 简单工厂模式(Simple Factory) 定义 优点 缺点 适用范围 代码实现 工厂方法模式(Factory Method) 定义 优点 缺点 适用范围 代码实现 抽象工厂模式(Abst ...

  3. IOS之Objective-C学习 工厂模式

    工厂模式在父类里声明(可实现)创建对象的一个接口,让子类决定实例化哪个类,也就是说让一个类的实例化延迟到子类中生产. 工厂模式一般用于在不同地方创建对象和项目部署依赖多个数据库的时候. 工厂模式有三种 ...

  4. C++模式学习------工厂模式

    工厂模式属于创建型模式,大致可以分为简单工厂模式.抽象工厂模式. 简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品. enum PTYPE { ProdA = , ProdB = ...

  5. 从BWM生产学习工厂模式

    工厂模式应用非常之广,在JDK底层源码以及各大主流框架中随处可见,一般以Factory结尾命名的类,比如Mybatis中的SqlSessionFactory,Spring中的BeanFactory等, ...

  6. [javascript] 看知乎学习js闭包

    知乎:到底什么是闭包? 寸志: JavaScript 闭包的本质源自两点,词法作用域和函数当作值传递. 词法作用域,就是,按照代码书写时的样子,内部函数可以访问函数外面的变量.引擎通过数据结构和算法表 ...

  7. [javascript] 看知乎学习js事件触发过程

    红色箭头代表捕获阶段 蓝色代表目标阶段 绿色代表冒泡阶段 调用元素对象的addEventListener()方法,参数:事件,回调函数,是否捕获(true代表捕获阶段,false代表冒泡阶段,ie浏览 ...

  8. 由XML解析学习工厂模式

    代码段1: startupData = new StartupData(); /* 设定自定义的MyHandler给XMLReader */ StartupXMLHandler startupData ...

  9. 设计模式学习——工厂模式(Factory Pattern)

    1.有一个工厂,专门生产不同品牌的汽车.当有人需要从此工厂提货的时候,只需要告诉他,要什么品牌的,就可以了,并不关心这些车是怎么生产出来的. 2.以上方式,如果增加品牌的时候,也要修改工厂,有点麻烦. ...

随机推荐

  1. Android常用库和插件

    下拉刷新 PullLoadMoreRecyclerView 实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性.网格.瀑布流效果演示 https://github.co ...

  2. NET 获取实例所表示的日期是星期几

    获取日期枚举,可以根据switch去进行操作 DateTime.Now.DayOfWeek

  3. Asp.Net MVC记住用户登录信息 下次登录无需输入密码

    有的时候做网站,就需要记住用户登录信息,下次再登录网站时,不用重复输入用户名和密码,原理是浏览器的cookie把状态给记住了! 那么具体是怎么实现的呢?下面博主将一部分代码贴出来,想要完整版的Demo ...

  4. 基于tkinter的九型人格测试系统介绍

    基于tkinter的九型人格测试系统介绍 一.程序代码地址,GitHub 二.程序介绍 1.login.py 登录界面: 注册界面: 2.mainWindow.py 登录成功之后的界面: 3.doTe ...

  5. cad2019卸载/安装失败/如何彻底卸载清除干净cad2019注册表和文件的方法

    cad2019提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装cad2019失败提示cad2019安装未完成,某些产品无法安装,也有时候想重新安装cad2019 ...

  6. 在Ubuntu 16.04上利用Jexus+.Net Core+Linux版SQL Server部署ZKEACMS.Core

    百度传课视频地址:https://chuanke.baidu.com/v5849090-223278-1498090.html 一.SQL Server on Linux的安装 官方文档:https: ...

  7. 使用libcurl的正确姿势

    libcurl支持访问http.ftp等各种服务器,下载图片AV什么的不在话下.但其存在多种接口,异步接口也很难以理解,到底什么样的使用姿势才是正确滴?我们来看看可用的体位: easy interfa ...

  8. 集合框架_DAY17

    1:五种数据结构: 数组:长度固定,有序,查找方便   链表:添加删除方便   栈:先进后出    队列:先进先出   树结构:完成排序动作 2:泛型(了解) (1)是一种把明确数据类型的工作推迟到创 ...

  9. windows线程退出的方法

    线程的handle用处: 线程的handle是指向“线程的内核对象”的,而不是指向线程本身.每个内核对象只是内核分配的一个内存块,并且只能由内核访问.该内存块是一种数据结构,它的成员负责维护对象的各种 ...

  10. Maven install [WARNING] The artifact aspectj:aspectjrt:jar:1.5.4 has been relocated to org.aspectj:aspectjrt:jar:1.5.4

    一.背景 最近在给项目打包的时候,在控制台老是出现一行警告:[WARNING] The artifact aspectj:aspectjrt:jar:1.5.4 has been relocated ...