`
jy03100000
  • 浏览: 34198 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

设计模式:工厂模式

 
阅读更多

定义

工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个子类的实例化延迟到其子类

Factory Pattern : Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses

 

优点

  1. 良好的封装性,代码结构清晰
  2. 优秀的扩展性
  3. 屏蔽产品类
  4. 典型的解耦框架:
  • 迪米特法则:高层只需要知道产品的抽象类,其他的实现都不用关心
  • 依赖倒置:只依赖产品类的抽象
  • 里氏替换,使用产品子类替换产品父类

使用场景

    主要用于需要灵活可扩展的框架时

 

具体实现

  • 通用工厂模式实现
//工厂需要制造的产品总接口
public interface Human {
 
    public void getColor();
 
    public void talk();
}

//每个产品的具体实现
public class BlackHuman implements Human {
 
    public void getColor() {
        System.out.println("My color is black!");
    }
 
    public void talk() {
        System.out.println("Hi, I am black human!");
    }
}
 
public class WhiteHuman implements Human {
 
    public void getColor() {
        System.out.println("My color is white!");
    }
 
    public void talk() {
        System.out.println("Hi, I am white human!");
    }
}
 
public class YellowHuman implements Human {
 
    public void getColor() {
        System.out.println("My color is yellow!");
    }
 
    public void talk() {
        System.out.println("Hi, I am yellow human!");
    }
}
 
//抽象产品创建工厂
public abstract class AbstractHumanFactory {
 
    public abstract <T extends Human> T createHuman(Class<T> c);
}
 
//产品创建工厂
public class HumanFactory extends AbstractHumanFactory {
 
    @Override
    public <T extends Human> T createHuman(Class<T> c) {
        Human human = null;
        try {
            human = (T) Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            System.out.println("Error!");
        }
        return (T) human;
    }
}

//场景类(调用)
public static void main(String[] args) {
        AbstractHumanFactory ahf = new HumanFactory();
 
        Human h1 = ahf.createHuman(BlackHuman.class);
        h1.talk();
        h1.getColor();
 
        Human h2 = ahf.createHuman(WhiteHuman.class);
        h2.talk();
        h2.getColor();
 
        Human h3 = ahf.createHuman(YellowHuman.class);
        h3.talk();
        h3.getColor();
}

  

  • 工厂扩展模式1:简单工厂模式
public class SimpleFactory {
 
    public static void main(String[] args) {
        Human h1 = HumanFactory.createHuman(BlackHuman.class);
        h1.talk();
        h1.getColor();
 
        Human h2 = HumanFactory.createHuman(WhiteHuman.class);
        h2.talk();
        h2.getColor();
 
        Human h3 = HumanFactory.createHuman(YellowHuman.class);
        h3.talk();
        h3.getColor();
    }
}
 
//工厂类
class HumanFactory {
 
    public static <T extends Human> T createHuman(Class<T> c) {
        Human human = null;
        try {
            human = (T) Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            System.out.println("Error!");
        }
        return (T) human;
    }
}

     个人理解:简化了的工厂模式,舍弃了抽象工厂类,直接用静态方法的方式构建工厂方法。代码结构简化了,但同时扩展性降低。一种较常用的变种模式

 

工厂扩展模式2:多个工厂类

public class MultiFactories {
 
    public static void main(String[] args) {
        Human whiteHuman = (new WhiteHumanFactory()).createHuman();
        Human blackHuman = (new BlackHumanFactory()).createHuman();
        Human yellowHuman = (new YellowHumanFactory()).createHuman();
    }
}
 
abstract class AbstractHumanFactory {
 
    public abstract Human createHuman();
}
 
class WhiteHumanFactory extends AbstractHumanFactory {
 
    @Override
    public Human createHuman() {
        return new WhiteHuman();
    }
}
 
class BlackHumanFactory extends AbstractHumanFactory {
 
    @Override
    public Human createHuman() {
        return new BlackHuman();
    }
}
 
class YellowHumanFactory extends AbstractHumanFactory {
 
    @Override
    public Human createHuman() {
        return new YellowHuman();
    }
}

     个人理解:当工厂方法本身非常复杂的时候,可以使用这个模式。缺点是一个产品类就要对应一个工厂类,增加了扩展的难度

 

  • 工厂扩展模式3:单例工厂模式
public class SingletonFactory {
 
    private static Singleton singleton;
 
    static {
        try {
            Class c1 = Class.forName(Singleton.class.getName());
            //获得无参构造
            Constructor constructor = c1.getDeclaredConstructor();
            //设置无参构造可访问
            constructor.setAccessible(true);
            //产生一个实例对象
            singleton = (Singleton) constructor.newInstance();
        } catch (Exception e) {
        }
    }
 
    public static Singleton getSingleton() {
        return singleton;
    }
}
 
class Singleton {
 
    private Singleton() {
    }
}

     个人理解:这也就是之前单例模式中提到的用反射实现在其他类中对仅拥有private构造函数的类进行初始化的方法。本人实际暂时还不能理解这种模式在什么场景下适用,今后如果有进一步体悟会来补全此处

 

抽象工厂模式

最后简单提一下抽象工厂模式

 

抽象工厂模式:为创建一组相关或相互依赖的对象提供一个借口,而且无需指定他们的具体类

Abstract Factory Pattern:Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

 

暂时不开单章说明这个模式了,因为个人没有遇到过类似的场景,理解实在不深。大体来说就是把工厂方法的职能更加细化,分到各个车间生产线级别。同时这些车间生产线生产的产品存在一定的关联性(产品族)

 

参考内容:《设计模式之禅》秦小波

 

分享到:
评论

相关推荐

    探索Java设计模式:工厂模式与抽象工厂模式的比较

    工厂模式和抽象工厂模式是两种常用的创建型设计模式,它们在Java中有着广泛的应用。本文将详细探讨这两种模式的区别,并提供代码示例来加深理解。 工厂模式和抽象工厂模式都是创建型设计模式,它们提供了代码解耦和...

    北大青鸟设计模式:工厂模式与抽象工厂模式应用

    北大青鸟关于设计模式的PPT,讲述的非常清晰,对于初学设计模式的人来说,非常有用。本篇是关于工厂模式与抽象工厂模式的PPT

    深入理解Python设计模式:工厂模式实践与应用

    设计模式是软件开发中的重要概念,其中工厂模式是一种常见的创建型设计模式。本文将深入探讨工厂模式的概念及实现方式,并通过Python代码示例演示如何在实际项目中应用工厂模式来创建对象。

    设计模式:可复用面向对象软件的基础.zip

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。这些模式经过时间的考验,被广泛应用于各种面向对象的软件开发中,以提高代码的可读性、可维护性和可复用性。本教程旨在深入讲解...

    《设计模式:可复用面向对象软件的基础》英文版

    包括抽象工厂模式(Abstract Factory)、建造者模式(Builder)、工厂方法模式(Factory Method)、原型模式(Prototype)和单例模式(Singleton)等。 - **结构型模式**:关注于类或对象的组合方式,使它们能形成更...

    设计模式:基于C#的工程化实现及扩展(完整电子版)

    总之,《设计模式:基于C#的工程化实现及扩展》是一本对于C#开发者来说非常有价值的参考资料,它不仅讲解了设计模式的理论,还提供了丰富的实践案例,帮助读者掌握如何在实际项目中应用这些模式,提升软件开发的专业...

    设计模式:可复用面向对象软件的基础(非扫描版+高清)

    设计模式分为三类:创建型模式(如单例模式、工厂方法模式)、结构型模式(如代理模式、装饰器模式)和行为型模式(如观察者模式、策略模式)。每种模式都有其特定的用途和适用场景。 4. **具体设计模式详解** - ...

    Java设计模式面试题汇总

    抽象工厂模式:抽象工厂模式通过在AbstractFactory中增加创建产品的接口,并在具体子工厂中实现新加产品的创建,可以实现产品的增加。 单例模式:单例模式属于创建型模式,一个单例类在任何情况下都只存在一个实例...

    设计模式:可复用面向对象软件的基础--详细书签版

     “[设计模式]在实用环境下特别有用,因为它分类描述了一组设计良好,表达清楚的面向对象软件设计模式。整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法...

    常用设计模式特点比如工厂模式、单例模式等等

    1. 工厂模式: 工厂模式是一种对象创建型设计模式,它提供了一种创建对象的最佳方式,通过将实例化过程封装在单独的工厂类中,使得客户端代码无需知道具体创建的对象类型。这样做的好处包括提高代码的灵活性、可扩展...

    软件设计模式作业+答案

    软件设计模式和软件体系结构知识点总结 software design patterns and software architecture knowledge points summary 创建型软件设计模式: 工厂模式(Factory Pattern):符合开闭原则,提供了一种创建对象的...

    工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式

    工厂模式是一种常用的软件设计模式,它是创建型设计模式的一种,主要解决对象的创建问题,将对象的创建过程封装起来,使得创建过程独立于使用过程。这样可以提高代码的可复用性和灵活性,同时降低了系统的耦合度。...

    设计模式:可复用的面向对象软件的基础

    常见的创建型模式有单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。 2. 结构型模式:这类模式关注如何组合类和对象以获得更大的结构,主要涉及如何将类或对象结合在一起形成更大的结构,但同时保持...

    设计模式_--_工厂模式和单件模式

    ### 设计模式——工厂模式与单例模式 #### 一、引言 设计模式是软件工程领域中的一个重要概念,它代表了在特定情况下解决常见问题的最佳实践。在本篇文章中,我们将深入探讨两种广泛使用的软件设计模式:工厂模式...

    设计模式:01工厂模式-labview实现

    在“设计模式:01工厂模式-labview实现”这个主题中,我们将深入探讨如何利用LabVIEW(Laboratory Virtual Instrument Engineering Workbench)这一图形化编程语言来实现工厂模式。 LabVIEW是由美国国家仪器公司...

    设计模式的工厂模式,单例模式

    在给定的标题和描述中,我们关注的是两种重要的设计模式:工厂模式和单例模式。 **工厂模式**是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当客户端需要创建一个对象时,而不是直接创建,...

    设计模式:单例设计模式(全部实现方式)工厂设计模式,抽象工厂模式

    单例设计模式、工厂设计模式和抽象工厂模式是常见的软件开发设计模式。这些设计模式提供了一些有用的思想和实现方式,可以帮助开发人员在设计和实现复杂的软件系统时,更加灵活和高效地进行编程。 单例设计模式是一...

    C++设计模式-工厂和单例

    本篇将深入探讨两种重要的设计模式:工厂模式和单例模式,以及如何在VC(Visual C++)环境下实现它们。 ### 工厂模式 **定义**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当...

    设计模式:简单工厂、方法工厂、抽象工厂、单例、原型、委派、模板、代理、策略

    1. **简单工厂**:简单工厂模式是一种创建型设计模式,它提供一个工厂类来负责创建对象,而无需暴露创建逻辑。客户端只需传递一个参数给工厂,工厂就会返回相应的对象。 2. **方法工厂**:通常,这是对简单工厂模式...

    深入理解Python设计模式:抽象工厂模式实践与应用

    深入理解Python设计模式:抽象工厂模式实践与应用

Global site tag (gtag.js) - Google Analytics