一、工厂模式(Factory Pattern)的介绍

  工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。使用工厂模式可能会多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

二、工厂模式的分类

  1.简单工厂模式

  2.工厂方法模式

  3.抽象工厂模式

三、简单工厂模式

  1.父类产品

 /**
* 父类产品
*/
public class Product {
public Product(){
System.out.println("------product------");
}
public void change(){
System.out.println("-----父类方法------");
}
}

·  2. A B C 三种子类产品

 //子类产品A
public class ProductA extends Product {
public ProductA() {
System.out.println("------产品A------");
}
@Override
public void change() {
System.out.println("------方法A------");
}
}
 //子类产品B
public class ProductB extends Product {
public ProductB() {
System.out.println("------产品B------");
} @Override
public void change() {
System.out.println("------方法B------");
}
}
 //子类产品C
public class ProductC extends Product {
public ProductC() {
System.out.println("------产品C------");
} @Override
public void change() {
System.out.println("------方法C------");
}
}

  3、创建产品的工厂类

  工厂类是整个模式的关键,包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象。

 /**
* 创建产品的工厂
*/
public class Factory { /**
* 静态方法,直接调用
* 自动向上转型,转为product
*/
public static Product createProduct(String param){
if (param.equals("A")){
Product productA = new ProductA();
return productA;
}else if (param.equals("B")){
Product productB = new ProductB();
return productB;
}else if (param.equals("C")){
ProductC productC = new ProductC();
return productC;
}
return new Product();
} public static void change(Product product){
product.change();
}
}

  4、比较普通创建对象的方法和测试简单工厂方法

 public class TestProduct {
@Test
public void test1(){
/**
* 没有工厂模式
* 每个产品都需要创建
*/
ProductA productA = new ProductA();
ProductB productB = new ProductB();
ProductC productC = new ProductC();
System.out.println("------productA------" + productA);
System.out.println("------productB------" + productB);
System.out.println("------productC------" + productC);
} @Test
public void test2(){
/**
* 工厂设计
* 参数不同,返回产品不同
* 向下转型,和本身的类型相关
*/
ProductA productA = (ProductA) Factory.createProduct("A");
ProductB productB = (ProductB) Factory.createProduct("B");
ProductC productC = (ProductC) Factory.createProduct("C");
System.out.println("------productA------" + productA);
System.out.println("------productB------" + productB);
System.out.println("------productC------" + productC);
// 多态测试
Factory.change(productA);
Factory.change(productB);
Factory.change(productC);
}
}

  5.小结简单工厂

  简单工厂的所有产品都是在一个工厂生产的,通过在构造时判断传入的参数不同来生产不同的产品,这种模式会随着产品的增加而越来越庞大,每次新增产品都要添加修改判断条件,即修改工厂类,给维护和扩展带来不便。并且一但工厂类中出错,所有产品都无法创建了。

四、工厂方法模式

  1.抽象产品工厂类

  工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

 /**
* 抽象产品工厂类
* Product为抽象产品
*/
public abstract class Factory {
abstract Product create();
}

  2.具体的A、B工厂类

  2个工厂都继承抽象工厂类,它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。

 /**
* A工厂生产A产品
*/
public class AFactory extends Factory {
@Override
public Product create() {
return new ProductA();
}
} /**
* B工厂生产B产品
*/
public class BFactory extends Factory {
@Override
Product create() {
return new ProductB();
}
}

  3.抽象产品接口

  它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

 /**
* 抽象产品接口
*/
public interface Product {
void method();
}

  4.具体产品类

  A、B 产品都实现抽象产品接口

 /**
* 具体产品A
*/
public class ProductA implements Product{
@Override
public void method() {
System.out.println("------ProductA------");
}
} /**
* 具体产品B
*/
public class ProductB implements Product {
@Override
public void method() {
System.out.println("------ProductB------");
}
}

  5.测试工厂方法

 public class TestFactoryMethod {
/**
* 创建不同的工厂,生产不同的产品
* @param args
*/
public static void main(String[] args) {
AFactory aFactory = new AFactory();
Product product = aFactory.create();
product.method(); BFactory bFactory = new BFactory();
Product product1 = bFactory.create();
product1.method();
/* 输出为:
------ProductA------
------ProductB------*/
}
}

  6.小结工厂方法

  工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。工厂方法模式实现了不同产品在不同工厂生产,维护和扩展比简单工厂模式好,即使一个产品出现问题,其他产品也可以正常生产。

五、抽象工厂模式

  1.抽象工厂类

 /**
* 抽象工厂类
* 可以创建分别生产A、B产品
*/
public interface AbstractFactory { ProductA factoryA(); ProductB factoryB();
}

  2.具体工厂

  A1和B1是一个产品族,由具体工厂1生产;A2和B2是一个产品族,由具体工厂2生产

 /**
* 具体工厂1
* 生产产品A1和B1
*/
public class Factory1 implements AbstractFactory {
@Override
public ProductA factoryA() {
return new ProductA1();
} @Override
public ProductB factoryB() {
return new ProductB1();
}
}
 /**
* 具体工厂2
* 生产产品A2和B2
*/
public class Factory2 implements AbstractFactory {
@Override
public ProductA factoryA() {
return new ProductA2();
} @Override
public ProductB factoryB() {
return new ProductB2();
}
}

  3.抽象产品接口

  抽象产品A接口

 /**
* 抽象产品A接口
*/
public interface ProductA {
}

  抽象产品B接口

 /**
* 抽象产品B接口
*/
public interface ProductB {
}

  4.具体产品

  具体产品A1,实现抽象产品A接口

 /**
* 具体产品A1
*/
public class ProductA1 implements ProductA {
public ProductA1(){
System.out.println("------ProductA1------");
}
}

  具体产品A2,实现抽象产品A接口

 /**
* 具体产品A2
*/
public class ProductA2 implements ProductA {
public ProductA2() {
System.out.println("------ProductA2------");
}
}

  具体产品B1,实现抽象产品B接口

 /**
* 具体产品B1
*/
public class ProductB1 implements ProductB {
public ProductB1() {
System.out.println("------ProductB1------");
}
}

  具体产品B2,实现抽象产品B接口

 /**
* 具体产品B2
*/
public class ProductB2 implements ProductB {
public ProductB2() {
System.out.println("------ProductB2------");
}
}

  5.测试抽象工厂

 /**
* 测试抽象功能工厂
*/
public class TestAbstractFactory {
public static void main(String[] args) {
Factory1 factory1 = new Factory1();
factory1.factoryA();
factory1.factoryB(); Factory2 factory2 = new Factory2();
factory2.factoryA();
factory2.factoryB();
/* 输出
------ProductA1------
------ProductB1------
------ProductA2------
------ProductB2------*/
}
}

  6.小结

  抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。

六、总结

简单工厂 : 用来生产同一等级结构中的任意产品,即所有产品由一个工厂生产,当需要添加新产品时,需要修改工厂类,不易扩展。

工厂方法 :用来生产同一等级结构中的固定产品,即不同的产品由不同的工厂生产,添加新产品只需要添加新工厂,更容易扩展,不过如果同一级产品有多个,会产生很多平行的工厂。

抽象工厂 :用来生产不同产品族的全部产品,即一个工厂生产一个产品族,每个产品族都是多个产品的同一级结构。

以上三种工厂方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法。

工厂模式(Factory Pattern)的更多相关文章

  1. 设计模式 - 工厂模式(factory pattern) 具体解释

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/27081511 工厂模式(factory pa ...

  2. 创建型模式篇(工厂模式Factory Pattern)

    一.工厂模式(Factory Pattern) 1.定义: 在软件系统,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.提供一种封 ...

  3. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

  4. 工厂模式(factory pattern) ------创造型模式

    创建型模式 简单工厂模式的缺点是: 当我们引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,需要修改工厂类的方法,违反了“开闭原则”. 工厂模式提供了一个抽象工厂接口来声明抽象工厂方 ...

  5. 工厂模式(factory pattern)

    工厂模式主要用来封装对象的创建,有3种分类:简单工厂(simple factory).工厂方法(factory method).抽象工厂(abstract factory). 简单工厂包括3种组成元素 ...

  6. 23种设计模式--工厂模式-Factory Pattern

    一.工厂模式的介绍       工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...

  7. 【设计模式】工厂模式 Factory Pattern

    1)简单工厂(不是模式) 简单工厂只是一种变成习惯,并非23种设计模式之一. 简单工厂提供将实例话那种类型留给运行时判断,而非编译时指定.简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个类的 ...

  8. JAVA设计模式之工厂模式—Factory Pattern

    1.工厂模式简介 工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦. 2.工厂模式分类 这里以制造coffee的例子开始工厂模式设计之旅. 我们知道coffee只是一种泛举,在点购咖啡时需要指 ...

  9. 设计模式 - 出厂模式(factory pattern) 详细说明

    出厂模式(factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27081511 工厂方法模式 ...

  10. 设计模式(一)工厂模式Factory(创建型)

    设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. ...

随机推荐

  1. 初探 模拟退火算法 POJ2420 HDU1109

    模拟退火算法来源于固体退火原理,更多的化学物理公式等等这里不再废话,我们直接这么来看 模拟退火算法简而言之就是一种暴力搜索算法,用来在一定概率下查找全局最优解 找的过程和固体退火原理有所联系,一般来讲 ...

  2. unity里的c#

    类方法:start只进行一次,update每一帧都会进行调用 拖动脚步到对应物体就可以将其关联 定义变量与c++相似 F2修改文件名 脚本的类名要与文件名保持一致 数组的定义:1.类型[] 数组名={ ...

  3. 使用ceph-deploy进行ceph安装

    ceph安装包介绍: 1.ceph-deploy: ceph的部署软件,通过该软件可以简便部署,这个软件并非整个ceph集群系统中必须的 2.ceph: ceph整个服务集群中的每个节点必须的软件.提 ...

  4. Oracle PL/SQL学习之你需要知道的快捷键

    1.格式化sql语句 Ctrl+A  然后  Ctrl+F7 2.窗口最大化最小化 首选项-->快捷键-->Maximize Toggle,然后修改成自己熟悉的快捷键设置.

  5. python全栈开发学习_day2_语言种类及变量

    一.编程语言的分类及python相对其他语言的优势 1)三大语言种类及细分 1.机器语言(低级语言):直接用计算能够理解的二进制进行编写,直接控制计算机硬件. 优点:执行效率高. 缺点:开发效率低,跨 ...

  6. [转] 基于Gitlab CI搭建持续集成环境

    [From] https://blog.csdn.net/wGL3k77y9fR1k61T1aS/article/details/78798577 前言 本文是在12月12号迅雷@赵兵在前端早读课第三 ...

  7. Android调用 .Net Core WebApi 返回数据,用FastJSON解析一直报错。

    问题描述:.Net Core WebApi中用Newtonsoft.Json 把datatable转成json字符串,如:JsonConvert.SerializeObject(table,Forma ...

  8. Ubuntu定时任务设置

    设置很简单,但如果误入歧途,会耽误很多时间 步骤如下: 1. 以root执行:vi /etc/crontab 2. 在文件最后添加cron配置(每天凌晨四点执行,并将日志输出到/data/cron.l ...

  9. Shell检查程序是否正常,并显示出程序启动时间、执行时间

    项目中多个实例,而每个实例均启动一个程序,本脚本将多个程序统一进行监控,并支持文件配置 #!/bin/sh bin=$(cd ``;pwd) cd ${bin} ### 定义检查函数 chkProgr ...

  10. linux下获取系统时间 和 时间偏移

    获取linux时间  并计算时间偏移 void getSystemTimer(void){#if 0 char *wdate[]={"Sun","Mon",&q ...