zoukankan      html  css  js  c++  java
  • 简单工厂模式-Simple Factory Pattern

    简单工厂模式-Simple Factory Pattern

       记得的很早的时候买过一本《大话设计模式》,里面的是C#写的demo都是诙谐的例子,还是不错,通俗易懂。不过还是推荐《java设计模式》,虽然我没有看过,但是评价很高。设计模式网上也有很多大牛写的博客和优秀的例子,我也学习借鉴下,记录下自己的体会和分享。

       设计模式一般的书上说有二十三种,又可以分为3大类:

        创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

       结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式

       行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

       今天就聊下简单的工厂模式。严格意义的讲,简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些。因为它至少不是Gof23种设计模式之一。但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导。

       模式定义:

    简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

       模式结构:

    简单工厂模式包含如下角色

    抽象产品角色:一般可以是一个产品接口,用来描述共有实例

    具体产品角色:主要功能是实现接口,Override接口中的方法

    工厂角色:简单工厂模式的核心,它负责实现创建所有具体产品类的实例。工厂类可以被外界直接调用,创建所需的产品对象。

    举例:图书出版社出版不同书籍

     创建Books接口

    1 package com.feimao.Pattern.test;
    2 
    3 public interface Books {
    4     public void pulishBooks();
    5 }

    创建语文书的类

    1 package com.feimao.Pattern.test;
    2 
    3 public class ChineseBook implements Books{
    4     @Override
    5     public void pulishBooks() {
    6         System.out.println("出版语文书");
    7     }
    8 }

    创建英语书的类

    1 package com.feimao.Pattern.test;
    2 
    3 public class EnglishBook implements Books{
    4     @Override
    5     public void pulishBooks() {
    6         System.out.println("出版英语书");
    7     }
    8 }

    创建数学书的类

    1 package com.feimao.Pattern.test;
    2 
    3 public class MathBook implements Books{
    4     @Override
    5     public void pulishBooks() {
    6         System.out.println("出版数学书");
    7     }
    8 }

    创建出版社工厂类

     1 package com.feimao.Pattern.test;
     2 
     3 public class BookFactory {
     4     public Books publish(String s){
     5         if(s.equals("math")){
     6             return new MathBook();
     7         }
     8         else if(s.equals("english")){
     9             return new EnglishBook();
    10         }
    11         else if(s.equals("chinese")){
    12             return new ChineseBook();
    13         }
    14             return null;
    15         }
    16     }

    创建测试类

     1 package com.feimao.Pattern.test;
     2 
     3 
     4 
     5 public class Tester {
     6     public static void main(String[] args){
     7         BookFactory bookFactory = new BookFactory();//实例化工厂
     8         /*Books books;*/
     9         Books books = bookFactory.publish("english");//输入一个english参数,初始化英语书构造器实例化,出版英语书对象
    10         books.pulishBooks();
    11     }
    12 }

    运行结果:

       聊完了简单工厂模式,我们再聊下其优缺点和衍生的工厂方法模式和抽象工厂模式。

       在简单工厂模式中只提供一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它需 要知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。简单工厂模式最大的 缺点是当有新产品要加入到系统中时,必须修改工厂类,需要在其中加入必要的业务逻辑, 这违背了“开闭原则”。此外,在简单工厂模式中,所有的产品都由同一个工厂创建,工厂类职 责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,严重影响了系统的灵活性 和扩展性。

       工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同 的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。工厂方法模式 定义如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个 类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式 (Factory Pattern),又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式 (Polymorphic Factory Pattern)。

      工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由 于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必 会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂 来统一生产,这就是我们本文将要学习的抽象工厂模式的基本思想。

       抽象工厂模式是工厂方法模式的进一步延伸,由于它提供了功能更为强大的工厂类并且具备 较好的可扩展性,在软件开发中得以广泛应用,尤其是在一些框架和API类库的设计中,例如 在Java语言的AWT(抽象窗口工具包)中就使用了抽象工厂模式,它使用抽象工厂模式来实 现在不同的操作系统中应用程序呈现与所在操作系统一致的外观界面。抽象工厂模式也是在 软件开发中最常用的设计模式之一。  抽象工厂模式的主要优点如下:

    (1) 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离, 更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接 口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

    (2) 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产 品族中的对象。 

    (3) 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。

      抽象工厂模式的主要缺点如下: 

      增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码, 这显然会带来较大的不便,违背了“开闭原则”。

  • 相关阅读:
    简明Python3教程 12.问题解决
    简明Python3教程 11.数据结构
    【SPOJ 694】Distinct Substrings
    【codeforces Manthan, Codefest 17 C】Helga Hufflepuff's Cup
    【CF Manthan, Codefest 17 B】Marvolo Gaunt's Ring
    【CF Manthan, Codefest 17 A】Tom Riddle's Diary
    【SPOJ 220】 PHRASES
    【POJ 3261】Milk Patterns
    【POJ 3294】Life Forms
    【POJ 1226】Substrings
  • 原文地址:https://www.cnblogs.com/feimaoyuzhubaobao/p/10051765.html
Copyright © 2011-2022 走看看