当前位置: 首页 > news >正文

[javaSE] 看知乎学习工厂模式

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();

 

相关文章:

  • 数据库分库分表扫盲,不会用也得知道概念
  • 写了那么久的String字符串,你可能根本不懂它!
  • 2012 借教室
  • 怎样才能写出规范的好代码?
  • 让Android Studio支持系统签名
  • 详解Java中的BIO、NIO、AIO
  • 取经阿里十年技术大佬,得到Java线上问题排查攻略!
  • Understanding memory usage on Linux
  • Java中的拦截器和过滤器有什么区别
  • 为什么要引入分布式任务调度系统?
  • 为什么说datax是目前最好的异构数据源数据交换工具
  • Java常用关键字:this、super、final、static、访问修饰符
  • JAVA UUID 生成唯一标识
  • 网络开发的最强大框架:Netty快速入门
  • 适配器模式详解与应用
  • Apache的基本使用
  • C++类的相互关联
  • CentOS6 编译安装 redis-3.2.3
  • CentOS7 安装JDK
  • go append函数以及写入
  • interface和setter,getter
  • LeetCode18.四数之和 JavaScript
  • Python十分钟制作属于你自己的个性logo
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • tensorflow学习笔记3——MNIST应用篇
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue-router的history模式发布配置
  • Vue组件定义
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 创建一种深思熟虑的文化
  • 简单实现一个textarea自适应高度
  • 开源SQL-on-Hadoop系统一览
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 聊聊flink的BlobWriter
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 前端
  • 使用docker-compose进行多节点部署
  • 算法-图和图算法
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • MPAndroidChart 教程:Y轴 YAxis
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • $.ajax()
  • %@ page import=%的用法
  • (6)设计一个TimeMap
  • (C++20) consteval立即函数
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (python)数据结构---字典
  • (篇九)MySQL常用内置函数
  • (一)Neo4j下载安装以及初次使用
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)我也是一只IT小小鸟
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ../depcomp: line 571: exec: g++: not found