zoukankan      html  css  js  c++  java
  • java23种设计模式之八: 工厂方法模式

    定义:

      定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的创建与使用相分离的特点。

      我们把被创建的对象称为产品,把创建产品的对象称为工厂。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫简单工厂模式

      它不属于 GoF 23 种经典设计模式,它的缺点是增加新产品时会违背开闭原则

    优点:

      用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;

      在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

    缺点:

      每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。

    结构:

      抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 createProduct() 来创建产品。

      具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。

      抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。

      具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

    总述:

      对于工厂方法其实就是让工厂生产产品,只不过我们把这个向上提取一下,我们以汽车为例,汽车厂肯定是生产汽车的,但是不同的汽车厂生产的汽车和型号不同,那我们就可以把这个工厂抽象一下,汽车工厂都是生产汽车的,具体哪一种车我们不知道,因此,我们把抽象工厂生产出来的车也是抽象的车,都拥有可以在路上跑的功能。然后,我们该造具体的车了,很简单,我们把具体的汽车品牌实现抽象出来的车就可以,因为具体的车也拥有在路上跑的功能,那这个车可以是奥迪、宝马、奔马等等。既然有了具体的汽车品牌,那我们可以让具体的工厂来造车,因此我们可以让奥迪汽车厂专门造奥迪,宝马专门造宝马,那么我们让具体的工厂实现之前抽象出来的工厂,这样,我们就可以让自家的汽车车生产自家的汽车。

    其实就是:具体的工厂生产具体的产品,让调用者无须参与创建过程。

    就像你买车一样,你会找到自己看中的品牌、车型,买下即可,但你不会参与整个生产过程一样

    //抽象工厂
    public
    interface AbstractFactory { AbstractProductCar createProducet(); } //抽象产品 public interface AbstractProductCar { void run(); } //具体产品 public class AudiCar implements AbstractProductCar{ @Override public void run() { System.out.println("奥迪车在路上跑。。。。。。"); } } //具体产品 public class BMWCar implements AbstractProductCar{ @Override public void run() { System.out.println("宝马车在路上跑。。。。。。"); } } //具体工厂 public class AudiCarFactory implements AbstractFactory{ @Override public AbstractProductCar createProducet() { return new AudiCar(); } } //具体工厂 public class BMWCarFactory implements AbstractFactory{ @Override public AbstractProductCar createProducet() { return new BMWCar(); } } //测试类 public class MainTest { public static void main(String[] args) { AbstractFactory bmwFactory = new BMWCarFactory(); bmwFactory.createProducet().run(); AbstractFactory audi = new AudiCarFactory(); audi.createProducet().run(); } }
  • 相关阅读:
    DataAnnotations
    使用BizTalk实现RosettaNet B2B So Easy
    biztalk rosettanet 自定义 pip code
    Debatching(Splitting) XML Message in Orchestration using DefaultPipeline
    Modifying namespace in XML document programmatically
    IIS各个版本中你需要知道的那些事儿
    关于IHttpModule的相关知识总结
    开发设计的一些思想总结
    《ASP.NET SignalR系列》第五课 在MVC中使用SignalR
    《ASP.NET SignalR系列》第四课 SignalR自托管(不用IIS)
  • 原文地址:https://www.cnblogs.com/MrRightZhao/p/11638594.html
Copyright © 2011-2022 走看看