工厂模式分为三种:简单工厂模式 (Simple Factory) 、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)

//举例:发送邮件和短信的例子

/**
* @author Administrator
* 产品类
*/
interface Sender{
  void send();
}
class MailSender implements Sender{
  @Override
  public void send() {
    System.out.println("this is a mailsender !");

  }
}
class SmsSender implements Sender{
  @Override
  public void send() {
    System.out.println("this is a smssender !");

}
}
/**
* @author Administrator
* 工厂类
*/
class SenderFactory{
  public Sender produce(String type){
    if("mail".equals(type)){
      return new MailSender();
    }else if("sms".equals(type)){
      return new SmsSender();
    }else{
      System.out.println("请输入正确的类型");
      return null;
    }
  }
}
/**
* @author Administrator
* 测试类
*/
public class SimpleFactoryTest{
  public static void main(String[] args) {
    SenderFactory factory = new SenderFactory();
    Sender sender = factory.produce("mail");
    sender.send();
  }
}

//结果:

this is a mailsender !

对于简单工厂模式而言,如果传递的字符串出错,则不能正确创建对象,或者说如果要发送彩信,需要去改进SenderFactory方法,显然违背了设计的原则
这里多个共产方法模式是提供了多个工厂方法,分别创建对象

/**
* @author Administrator
* 工厂类
*/
//class SenderFactory2{
// //发短信
//   public Sender smsProduce(){
//      return new SmsSender();
//   }
// //发邮件
//   public Sender mailProduce(){
//      return new MailSender();
//   }
//}
//也可以将工厂方法类改为静态的,这样就可以不同通过创建工厂的实例去调用
class SenderFactory2{
//发短信
  public static Sender smsProduce(){
    return new SmsSender();
  }
//发邮件
  public static Sender mailProduce(){
    return new MailSender();
  }
}

/**
* @author Administrator
* 测试类
*/
public class FactoryMethodTest {

  public static void main(String[] args) {
//     SenderFactory2 factory2= new SenderFactory2();
//      factory2.smsProduce().send();
//     factory2.mailProduce().send();

    //静态工厂方法模式
    SenderFactory2.smsProduce().send();
    SenderFactory2.mailProduce().send();
  }

}

/**
* @author Administrator
* 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是,如果想要扩展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题。
* 解决:用抽象工厂模式,创建多个工厂,这样一旦需要增加新功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
*
* 抽象工厂模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需要做一个实现类,实现Sender接口,同时做一个工厂类,实现Factory接口,就OK了,无需改现成的代码。这样做,扩展性好。
*/

//工厂类,多个工厂类
interface Factory{
  Sender produce();
}
class SmsFactory implements Factory{
  @Override
  public Sender produce() {
    return new SmsSender();
  }
}
class MailFactory implements Factory{
  @Override
  public Sender produce() {
    return new MailSender();
  }
}

/**
* @author Administrator
* 测试类
*/
public class AbstractFactoryTest {

  public static void main(String[] args) {
    Factory factory = new SmsFactory();
    Sender sender = factory.produce();
    sender.send();
  }

}

设计模式(二)工厂模式Factory (创建型)的更多相关文章

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

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

  2. 设计模式之工厂模式(Factory)

    设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...

  3. 设计模式二: 工厂方法(Factory Method)

    简介 工厂方法模式是创建型模式的一种, 核心结构有四个角色: 抽象工厂,具体工厂,抽象产品,具体产品; 实现层面上,该模式定义一个创建产品的接口,将实际创建工作推迟到具体工厂类实现, 一个产品对应一个 ...

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

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

  5. 设计模式~简单工厂模式(Factory)

    简单工厂模式Simple Factory根据提供给它的数据,返回一个类的实例.通常它返回的类都有一个公共的父类(或者接口对象). 简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类 ...

  6. 设计模式之工厂模式(Factory模式)

    在面向对象系统设计中经常遇到以下两类问题: 1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口.这样我们可以通过声明一个指向基类的 ...

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

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

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

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

  9. 设计模式之工厂模式 Factory实现

    simpleFactory //car接口 public interface Car { void run(); } //两个实现类 public class Audi implements Car{ ...

  10. java设计模式之 工厂模式Factory

    好比某种套路,经过不断实践,证明对项目结构非常有利 如果需要获取某种对象,如同获取不同的产品 需要由工厂来提供,工厂模式 可能的类或者对象:工厂类  产品:Cat  Dog  Fish ... //动 ...

随机推荐

  1. My.Ioc 的性能

    IoC/DI 这个概念,最初是由 Martin Fowler 提出来的.之后,很快在 Java 社区大行其道.在 .net 社区,IoC 的流行要比 Java 晚一些.尽管如此,现在开源社区中也已经出 ...

  2. 开发RESTful WebService

    RESTful风格的webservice越来越流行了,sun也推出了RESTful WebService的官方规范:JAX-RS,全称:Java API for RESTful WebService. ...

  3. AMD和CMD的区别

    1.cmd define(function(require,export){ var b = 1; var a = require('./a'); a.dosomething(); }); 2.amd ...

  4. NOI 191钉子和小球.cpp

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; ][]; in ...

  5. history对象属性和方法

    history对象保存着用户上网的历史记录,从窗口被打开的那一刻算起,history是window对象的属性,因此每个浏览器窗口.每个标签页乃至每个框架,都有自 己的history对象和特定的wind ...

  6. php错误级别设置

    在php.ini中可以设置服务器对错误的报警级别.在默认情况下,php将报告除了通知之外的所有错误. 错误报告级别是通过一些预定义的常量来设置的, 语法 int error_reporting ( [ ...

  7. thinkphp 内置函数详解

    D() 加载Model类M() 加载Model类 A() 加载Action类L() 获取语言定义C() 获取配置值    用法就是   C("这里填写在配置文件里数组的下标")S( ...

  8. C语言基础学习运算符-赋值运算符

    简单赋值 在C语言里,运算符=并不表示相等,而是一个赋值运算符.这意味着,符号=的左边该是一个可修改的变量名,而右边是赋给该变量的值. 如下程序语句: i = i+; 在数学上,该等式无法成立.而作为 ...

  9. windows下Django 部署到Apache24的配置

    1.首先下载最新版Apachehttp://httpd.apache.org/download.cgi#apache24,目前官方以不提供windows msi安装包,下载好的直接解压至C盘即可,ap ...

  10. 栈的顺序存储方式的C语言实现

    /* 编译器:Dev-c++ 5.4.0 文件名:stack.cpp 代码版本号:1.0 时间:2015-10-10 20:08:54 */ #include <stdio.h> #inc ...