zoukankan      html  css  js  c++  java
  • 工厂方法模式

    1,定义

              所谓工厂方法模式(Factory Method Pattern),就是定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对象,也就是将实际创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品的创建。

    2,优点

    • 简单工厂模式的进一步抽象,可以使系统在不修改具体工厂角色的情况下引进新的产品, 完全实现“开-闭”原则, 对扩展开发,对修改关闭
    • 依赖于抽象,而不是具体的实现类, 大大降低了客户程序与实现细节的耦合度
    • 可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。

    3, 使用场合

    • 当子类可能会很多, 以后需要不断的增添子类实现时;
    • 当一个系统尚在框架设计阶段,还不知道将来需要实例化哪些具体类时;
    • 系统设计之初不需要具体对象的概念

        image

    通过工厂方法模式的类图可以看到,工厂方法模式有四个要素:

    • 工厂接口:工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。
    • 具体工厂:具体工厂决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的具体工厂。
    • 抽象产品:抽象产品的主要目的是定义产品的规范,所有的具体产品都必须遵循抽象产品所定义的规范。
    • 具体产品:抽象产品的具体实现,决定了产品在客户端中的具体行为。

    抽象工厂生产抽象产品,具体工厂生产具体产品       

    工厂接口

    public  interface ICreateCar  {
        public AbstractCar createCar() ;
    
    }

    具体工厂

    public  class FactoryKindCar  implements ICreateCar {
        @Override
        public AbstractCar createCar() {
            
            return new KindCar("KindCar","Red"); 
        }    
     }

    抽象产品

    public  abstract class AbstractCar  {
        protected String name;
        protected String color;
    
        public abstract void start();    
    
     }

    具体产品

    public  class KindCar extends AbstractCar  {
    
        public KindCar(String name,String color)
        {
            this.name = name;
            this.color = color;
        }
        @Override
        public void start() {
            
            System.out.println("The car "+this.name+" color with "+this.color+" is running!");
            
        }
    
     }

    下面建立一个客产测试程序:

    public class FactoryMethodTesting {
    
        public static void main(String[] str)
        {
            ICreateCar createcar = new FactoryKindCar();
            AbstractCar car = createcar.createCar();
            car.start();
        }
        
    }

    这里突出一个原则,永远面向抽象及接口编程,而不是具体实现, 假如有一种新的车要增加,我们只需添加一个具体产品与具体工厂, 丝毫不会影响原来的应用逻辑,支持“开-闭原则。

    动行结果

    image

  • 相关阅读:
    CF766 ABCDE
    CF767 C.Garland DFS
    CF767 B. The Queue 贪心+细节
    CF767 A. Snacktower 暴力
    CF760 D Travel Card 简单DP
    CF760 C. Pavel and barbecue 简单DFS
    CF758 D. Ability To Convert 细节处理字符串
    ZOJ 3787 Access System 水
    ZOJ 3785 What day is that day?
    ZOJ 3782 G
  • 原文地址:https://www.cnblogs.com/mshwu/p/3341821.html
Copyright © 2011-2022 走看看