工厂模式分为三种:简单工厂模式 (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. Excel.Application手册

    ----转载:http://blog.csdn.net/xxfigo/article/details/6618129 定制模块行为(1) Option Explicit '强制对模块内所有变量进行声明 ...

  2. APP长时间处于后台,再次调用时提示用户重新登录

    第一步:当应用被处于后台时,调用计时器的start()方法,开始计时 在所有Activity继承的BaseSwiBackAct中的 public void onStop() { EventBus.ge ...

  3. leetcode修炼之路——383. Ransom Note

    题目是这样的 Given
 an 
arbitrary
 ransom
 note
 string 
and 
another 
string 
containing 
letters from
 a ...

  4. XCode的一些调试技巧

    XCode 内置GDB,我们可以在命令行中使用 GDB 命令来调试我们的程序.下面将介绍一些常用的命令以及调试技巧. po 命令:为 print object 的缩写,显示对象的文本描述(显示从对象的 ...

  5. 使用<span>标签为文字设置单独样式

    这一小节讲解<span>标签,我们对<em>.<strong>.<span>这三个标签进行一下总结: 1. <em>和<strong& ...

  6. CSS 布局Float 【1】

    1.HTML元素分类 HTML元素大题可分为内联(inline)元素和块(block)元素. 1.1 内联元素(inline) ①元素显示方式:"文本方式",1个挨着1个,不独自占 ...

  7. js 函数参数形式

    1. var a = function(b,c){ console.log(arguments);}a("1","cc"); ->  ["1&q ...

  8. javascript 常用array类型方法

    concat:基于当前数组中的所有项创建一个新数据,会创建当前数组一个副本,然后将接受到的参数放到数组末尾,最后返回新数组.如果没有参数,则复制当前数组并返回副本. slice:基于当前数组中一个或多 ...

  9. int, NSInteger, NSUInteger, NSNumber的区别

    新手在接触iOS或者Mac开发的时候,看到int和NSInteger,一般不清楚应该用哪个比较合适.我们先来查看下NSInteger的定义 #if __LP64__ || (TARGET_OS_EMB ...

  10. 导出页面文档(只在IE8下测试过)

    之前说过一篇关于打印的方法,就顺便也看了一下导出,但是该方法需要用户更改浏览器的安全级别设置,因此并不十分推荐,大家如真有需要可以参考一下ZeroClipboard这款插件,我有时间也会去学习一下并贴 ...