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(); } }
  • 相关阅读:
    队列与堆栈
    Python中的内置函数
    Centos 7 最小化部署svn版本控制(svn协议)
    Android中的一些简单的adb命令
    liunx服务程序的安装及配置
    liunx中安装包及其应用
    liunx网络基本命令
    liunx系统和其它的基本命令
    liunx用户管理的基本命令
    liunx的磁盘管理的基本命令
  • 原文地址:https://www.cnblogs.com/MrRightZhao/p/11638594.html
Copyright © 2011-2022 走看看