zoukankan      html  css  js  c++  java
  • 简单工厂模式

    工厂模式

    简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

    可以看出,上面总共有三种类,一个是工厂类Creator,一个是产品接口IProduct,一个便是具体的产品,例如产品A和产品B,这之中,工厂类负责整个创建产品的逻辑判断,所以为了使工厂类能够知道我们需要哪一种产品,我们需要在创建产品时传递给工厂类一个参数,去表明我们想要创建哪种产品。将上面类图转化成代码如下:

    public interface IProduct {
    
        public void method();
    }
    public class ProductA implements IProduct{
    
        public void method() {
            System.out.println("产品A方法");
        }
    
    }
    public class ProductB implements IProduct{
    
        public void method() {
            System.out.println("产品B方法");
        }
    
    }
    //工厂类
    public class Creator {
        private Creator(){}
        
        public static IProduct createProduct(String productName){
            if (productName == null) {
                return null;
            }
            if (productName.equals("A")) {
                return new ProductA();
            }else if (productName.equals("B")) {
                return new ProductB();
            }else {
                return null;
            }
        }
    }

    以上是简单工厂模式,如果新增一个产品需要在工厂中增加一个if判断,这种也不是一种很好的解耦,在一下篇中的抽象工厂的设计模式中,将工厂也进一步抽象,让工厂只生产某一种产品;


    工厂方法模式

    对工厂的进一步抽象;

        可以看到工厂方法模式中定义了一个工厂接口,而具体的创建工作推迟到具体的工厂类,它是对简单工厂模式中的工厂类进一步抽象化,从而产生一个工厂类的抽象和实现体系,从而弥补简单工厂模式对修改开放的诟病。下面右半部分是产品抽象和实现体系,左半部分是工厂抽象和实现体系,其中工厂体系依赖于产品体系,每一个工厂负责创造一种产品,这就省去了简单工厂中的elseif判断,又客户端决定实例化一个特定的工厂去创建相应的产品。

    抽象产品接口

    public interface Light {
    
        public void turnOn();
    
        public void turnOff();
        
    }

    具体产品

    public class BuldLight implements Light{
    
        public void turnOn() {
            System.out.println("BuldLight On");    
        }
    
        public void turnOff() {
            System.out.println("BuldLight Off");    
        }
    
    }
    public class TubeLight implements Light{
    
        public void turnOn() {
            System.out.println("TubeLight On");    
        }
    
        public void turnOff() {
            System.out.println("TubeLight Off");    
        }
    
    }

    抽象的工厂接口

    public interface Creator {
    
        public Light createLight();
    }

    产品的具体工厂

    public class BuldCreator implements Creator{
    
        public Light createLight() {
            return new BuldLight();
        }
    
    }
    public class TubeCreator implements Creator{
    
        public Light createLight() {
            return new TubeLight();
        }
    
    }

    测试类:

    public class Client {
    
        public static void main(String[] args) {
            Creator creator = new BuldCreator();
            Light light = creator.createLight();
            light.turnOn();
            light.turnOff();
            
            creator = new TubeCreator();
            light = creator.createLight();
            light.turnOn();
            light.turnOff();
        }
    }

    输出结果:

        工厂方法模式弥补了简单工厂模式不满足开闭原则的诟病,当我们需要增加产品时,只需要增加相应的产品和工厂类,而不需要修改现有的代码。


    抽象工厂模式

  • 相关阅读:
    ValidateInput(false)与this.ValidateRequest = false无效的解决方案
    WPF ListView CellTemplate Border设置ListView单元格的边框
    MFC4简单的窗口重绘(非部分重绘)
    针对每个用户的作业(针对用户的定期事件)
    用JQUERY做大表单(多表单域)AJAX提交
    MFC2消息处理
    asp.net mvc实战学习笔记(1)
    NHibernate基础拾遗
    FLEX/FLASH冒泡事件与非冒泡事件
    MFC1创建窗体
  • 原文地址:https://www.cnblogs.com/crazytrip/p/6676989.html
Copyright © 2011-2022 走看看