zoukankan      html  css  js  c++  java
  • 设计模式之简单工厂和工厂方法模式

    简单工厂和工厂方法模式都是将对象的创建交由工厂处理,运用了工厂方法模式,我们代码中的if else被不同类型的具体工厂类所取代,这样在增加新的产品的时候不用修改原来的代码, 增加了可维护性。 当然这样做的后果就是项目中多了很多的类和接口, 增加了系统复杂性。简单工厂中的角色包括:

    • 角色
      • 工厂类
      • 抽象产品
      • 具体产品

    具体产品实现抽象产品接口。重写抽象产品中的抽象方法,是其具有具体产品自己的方法特征,每个具体的产品由同一个工厂类创建。先看一下每个角色的代码实现

    工厂类:Factory.java

    package com.songpu.dp.factory;
    public class Factory  {
    	public Food createFood(){
    		return new Food();
    	}
    	
    	public Toy createToy(){
    		return new Toy();
    	}
    }
    
    

    抽象产品:Product.java

    package com.songpu.dp.factory;
    public interface Product {
    	public void operatet();
    }
    

    具体产品:Toy.java和Food.java

    
    package com.songpu.dp.factory;
    public class Toy implements Product{
    	@Override
    	public void operatet() {
    		System.out.println("Toy被生产");
    	}
    }
    
    package com.songpu.dp.factory;
    public class Food  implements Product{
    	@Override
    	public void operatet() {
    		System.out.println("Food被生产");
    	}
    }
    

    测试一下

    package com.songpu.dp.test;
    import com.songpu.dp.factory.*;
    import static org.junit.Assert.*;
    import org.junit.Test;
    public class testFactory {
    	@Test
    	public void test() {
    		Factory f = new Factory();
    		Product food;
    		Product toy;
    		food = f.createFood();
    		toy=f.createToy();
    		food.operatet();
    		toy.operatet();
    	}
    }
    

    最后的执行结果如下

    Food被生产
    Toy被生产
    

    在简单工厂中,如果需要增加一个产品的创建,就必须在工厂类中增加创建产品的代码,这不符合设计模式中的开闭原则(一个软件实体应该通过扩展来实现变化,而不是通过修改已有代码来实现变化),所以工厂方法模式就是对简单工厂的改进,增加一个抽象工厂的角色,可以通过实现该抽线工厂来扩展具体工厂类。

    这里代码的改动就是在增加了抽象工厂,具体工厂类实现抽象工厂,并且每个具体的产品由响应的一个工厂类创建。

    • 角色
      • 抽象工厂
      • 具体工厂类
      • 抽象产品
      • 具体产品类

    抽象工厂:Factory.java

    package com.songpu.dp.factorymethod;
    public interface Factory {
    	public Product createProduct();
    }
    

    具体工厂类:FoodFactory.java和ToyFood.java

    package com.songpu.dp.factorymethod;
    public class FoodFactory implements Factory {
    	@Override
    	public Product createProduct() {
    		return new Food();
    	}
    }
    
    
    package com.songpu.dp.factorymethod;
    public class ToyFactory implements Factory {
    	@Override
    	public Product createProduct() {
    		return new Toy();
    	}
    

    抽象产品:Product.java与具体产品类:Food.java和Toy.java的代码和上面的一致。

    测试一下

    package com.songpu.dp.test;
    import com.songpu.dp.factorymethod.*;
    import static org.junit.Assert.*;
    import org.junit.Test;
    public class testProductMethod {
    	@Test
    	public void test() {
    		FoodFactory ff = new FoodFactory();
    		ToyFactory tf = new ToyFactory();
    		Product food;
    		Product  toy;
    		food = ff.createProduct();
    		toy = tf.createProduct();
    		food.operate();
    		toy.operate();
    	}
    }
    

    最后执行的结果如下

    Food被生产
    Toy被生产
    
  • 相关阅读:
    使用数据(二)
    lambda表达式
    方法引用::
    开发 Web 应用(一)
    Spring基础(三)
    Spring基础(二)
    Spring 基础(一)
    项目实践之Ajax 技术使用教程
    项目实践之前后端分离详解
    考研计算机基础:构造算法与自上而下逐步完善:实例研究3(嵌套控制结构)
  • 原文地址:https://www.cnblogs.com/sweiqi/p/5989751.html
Copyright © 2011-2022 走看看